Borland C++-5.5 (free) compiler does not install(?)

Niclas Carlsson nkarlsso at abo.NO-SPAM-PLEASE.fi
Sat Apr 28 16:51:48 CDT 2001


g.patel at wanadoo.fr writes:

>On 05 Apr 01 12:59:17 -0800, "Charlie Gibbs" <cgibbs at sky.bus.com>
>wrote:
><snip>
>> It's the linker
>>(ILINK32.EXE) that hangs.  I've run many tests with both BCB4 and
>>the version 5 free download.  Too bad - I'd love to get it running
>>under Wine myself.

>The following hack is fixing Bcb4. I don't know about bcc5.

Ok, I just had a sudden fit of boredom.

So I took a hypothetical look at a certain linker which has had some problems
with a certain non-emulator and I wrote a test program to exhibit the
problems. It seems that this linker looks for a large block of free memory in
a certain memory-range and then tries to find a maximally well-aligned
sub-block within it. This alignment procedure suffers from some problems.
The ironical thing is that setting "winver nt40" changes the memory
range it searches, but due to the alignment part it still causes the same
crash under wine.

I suppose this is to be considered a bug in the linker in question, but if
someone spots an acceptable fix in wine (which Alexandre would accept, that
is), then do by all means fix it. Or is there another way to get the linker in
question fixed (home patching doesn't seem elegant)? Anyone tried contacting
the vendor in question?

Anyway, here's my hackish test-app:

-------------------------------------------------------------------------------

/* VirtualQuery() test
 *
 * This program tries to find a well aligned block of size >= min_size
 *
 * It does this by finding a large block and then aggressively finding
 * a good alignment within the block.
 */

#include <windows.h>
#include <stdio.h>

main() {

  MEMORY_BASIC_INFORMATION mbi;
  unsigned int i,address,diff,size,min_size,limit_hi,record_base,record_size;
  unsigned int alignment,adjusted_base,base;

  printf("VirtualQuery() test.\n\n");

  address=0x80000000;      /* Win9x: 0x80000000, WinNT: 0x400000 ??? */
  limit_hi=0xffff0000;
  min_size=0x2000000;
  record_size=0;
  record_base=0;

  i=0;
  do {
    if (!VirtualQuery((const void *)address, &mbi, sizeof(mbi))) break;

    address=(unsigned int)mbi.BaseAddress;
    size=mbi.RegionSize;

    printf("%3.3d-%8.8x: base=%8.8x, state=%8.8x, region_size=%8.8x\n",
	  i,address,address,mbi.State,size);

    if (mbi.State==MEM_FREE && size>min_size && size>record_size) {
      record_size=size;
      record_base=address;
    }
    if (address+min_size-1 < address) break;
    diff=(min_size-1<=size)?size:min_size-1;
    if (address+diff <= address) break;
    address+=diff;
    i++;
  } while (address < limit_hi);

  if (!record_size) {
    printf("\nProgram failed to find a large enough chunk. It shouldn't crash, though\n");
    exit(1);
  }
  printf("\nRecord: base %8.8x, size %8.8x\n\n",record_base, record_size);
  printf("Now aligning with min_size in thought:\n");
  
  alignment=2;
  adjusted_base=base=record_base;
  while (adjusted_base+min_size < record_base+record_size) {
    base=adjusted_base;   /* save last good one for later use */
    adjusted_base += alignment-1;
    adjusted_base &= ~(alignment-1);
    printf("Adjusted base (now trying): %8.8x (alignment=%8.8x)\n",
	    adjusted_base,alignment);
    if (!alignment) {
      printf("Oops. This shouldn't be happening (infinite loop).\n");
      break;
    }
    alignment<<=1;
  }

  printf("\nFinal address: base %8.8x\n",base);
  return;

}

-------------------------------------------------------------------------------

Running it under Win95 gives:


VirtualQuery() test.

000-80000000: base=80000000, state=00002000, region_size=00001000
001-81fff000: base=81fff000, state=00002000, region_size=000cf000
002-83ffe000: base=83ffe000, state=00010000, region_size=3bb52000
003-bfb50000: base=bfb50000, state=00001000, region_size=00001000

Record: base 83ffe000, size 3bb52000

Now aligning with min_size in thought:
Adjusted base (now trying): 83ffe000 (alignment=00000002)
Adjusted base (now trying): 83ffe000 (alignment=00000004)
Adjusted base (now trying): 83ffe000 (alignment=00000008)
Adjusted base (now trying): 83ffe000 (alignment=00000010)
Adjusted base (now trying): 83ffe000 (alignment=00000020)
Adjusted base (now trying): 83ffe000 (alignment=00000040)
Adjusted base (now trying): 83ffe000 (alignment=00000080)
Adjusted base (now trying): 83ffe000 (alignment=00000100)
Adjusted base (now trying): 83ffe000 (alignment=00000200)
Adjusted base (now trying): 83ffe000 (alignment=00000400)
Adjusted base (now trying): 83ffe000 (alignment=00000800)
Adjusted base (now trying): 83ffe000 (alignment=00001000)
Adjusted base (now trying): 83ffe000 (alignment=00002000)
Adjusted base (now trying): 84000000 (alignment=00004000)
Adjusted base (now trying): 84000000 (alignment=00008000)
Adjusted base (now trying): 84000000 (alignment=00010000)
Adjusted base (now trying): 84000000 (alignment=00020000)
Adjusted base (now trying): 84000000 (alignment=00040000)
Adjusted base (now trying): 84000000 (alignment=00080000)
Adjusted base (now trying): 84000000 (alignment=00100000)
Adjusted base (now trying): 84000000 (alignment=00200000)
Adjusted base (now trying): 84000000 (alignment=00400000)
Adjusted base (now trying): 84000000 (alignment=00800000)
Adjusted base (now trying): 84000000 (alignment=01000000)
Adjusted base (now trying): 84000000 (alignment=02000000)
Adjusted base (now trying): 84000000 (alignment=04000000)
Adjusted base (now trying): 88000000 (alignment=08000000)
Adjusted base (now trying): 90000000 (alignment=10000000)
Adjusted base (now trying): a0000000 (alignment=20000000)
Adjusted base (now trying): c0000000 (alignment=40000000)

Final address: base a0000000

-------------------------------------------------------------------------------

Whereas Wine gives:

VirtualQuery() test.

000-80000000: base=80000000, state=00010000, region_size=7fff0000

Record: base 80000000, size 7fff0000

Now aligning with min_size in thought:
Adjusted base (now trying): 80000000 (alignment=00000002)
Adjusted base (now trying): 80000000 (alignment=00000004)
Adjusted base (now trying): 80000000 (alignment=00000008)
Adjusted base (now trying): 80000000 (alignment=00000010)
Adjusted base (now trying): 80000000 (alignment=00000020)
Adjusted base (now trying): 80000000 (alignment=00000040)
Adjusted base (now trying): 80000000 (alignment=00000080)
Adjusted base (now trying): 80000000 (alignment=00000100)
Adjusted base (now trying): 80000000 (alignment=00000200)
Adjusted base (now trying): 80000000 (alignment=00000400)
Adjusted base (now trying): 80000000 (alignment=00000800)
Adjusted base (now trying): 80000000 (alignment=00001000)
Adjusted base (now trying): 80000000 (alignment=00002000)
Adjusted base (now trying): 80000000 (alignment=00004000)
Adjusted base (now trying): 80000000 (alignment=00008000)
Adjusted base (now trying): 80000000 (alignment=00010000)
Adjusted base (now trying): 80000000 (alignment=00020000)
Adjusted base (now trying): 80000000 (alignment=00040000)
Adjusted base (now trying): 80000000 (alignment=00080000)
Adjusted base (now trying): 80000000 (alignment=00100000)
Adjusted base (now trying): 80000000 (alignment=00200000)
Adjusted base (now trying): 80000000 (alignment=00400000)
Adjusted base (now trying): 80000000 (alignment=00800000)
Adjusted base (now trying): 80000000 (alignment=01000000)
Adjusted base (now trying): 80000000 (alignment=02000000)
Adjusted base (now trying): 80000000 (alignment=04000000)
Adjusted base (now trying): 80000000 (alignment=08000000)
Adjusted base (now trying): 80000000 (alignment=10000000)
Adjusted base (now trying): 80000000 (alignment=20000000)
Adjusted base (now trying): 80000000 (alignment=40000000)
Adjusted base (now trying): 80000000 (alignment=80000000)
Adjusted base (now trying): 00000000 (alignment=00000000)
Oops. This shouldn't be happening (infinite loop).

Final address: base 80000000

-------------------------------------------------------------------------------

I hope this sheds some light on the problems.

Nicke
-- 
                    "A witty saying proves nothing."
                              - Voltaire (1694-1778)



More information about the wine-users mailing list