forcing stack w/i 32bit when -m64 -mcmodel=small

Posted by chaosless on Stack Overflow See other posts from Stack Overflow or by chaosless
Published on 2010-05-04T18:04:02Z Indexed on 2010/05/04 18:08 UTC
Read the original article Hit count: 239

Filed under:

have C sources that must compile in 32bit and 64bit for multiple platforms. structure that takes the address of a buffer - need to fit address in a 32bit value.

obviously where possible these structures will use natural sized void * or char * pointers. however for some parts an api specifies the size of these pointers as 32bit.

on x86_64 linux with -m64 -mcmodel=small tboth static data and malloc()'d data fit within the 2Gb range. data on the stack, however, still starts in high memory.

so given a small utility _to_32() such as:

int _to_32( long l ) {
  int i = l & 0xffffffff;
  assert( i == l );
  return i;
}

then:

char *cp = malloc( 100 );
int a = _to_32( cp );

will work reliably, as would:

static char buff[ 100 ];
int a = _to_32( buff );

but:

char buff[ 100 ];
int a = _to_32( buff );

will fail the assert().

anyone have a solution for this without writing custom linker scripts?

or any ideas how to arrange the linker section for stack data, would appear it is being put in this section in the linker script:

.lbss   :
{
  *(.dynlbss)
  *(.lbss .lbss.* .gnu.linkonce.lb.*)
  *(LARGE_COMMON)
}

thanks!

© Stack Overflow or respective owner

Related posts about 32bit-64bit