• Work
    April 20, 2012

What is -xcode=abs44?

Guest Author

I've talked about building 64-bit libraries with position independent code. When building 64-bit applications there are two options for the code that the compiler generates: -xcode=abs64 or -xcode=abs44, the default is -xcode=abs44. These are documented in the user guides. The abs44 and abs64 options produce 64-bit applications that constrain the code + data + BSS to either 44 bit or 64 bits of address.

These options constrain the addresses statically encoded in the application to either 44 or 64 bits. It does not restrict the address range for pointers (dynamically allocated memory) - they remain 64-bits. The restriction is in locating the address of a routine or a variable within the executable.

This is easier to understand from the perspective of an example. Suppose we have a variable "data" that we want to return the address of. Here's the code to do such a thing:

extern int data;
int * address()
return &data;

If we compile this as a 32-bit app we get the following disassembly:

/* 000000          4 */         sethi   %hi(data),%o5
/* 0x0004 */ retl ! Result = %o0
/* 0x0008 */ add %o5,%lo(data),%o0

So it takes two instructions to generate the address of the variable "data". At link time the linker will go through the code, locate references to the variable "data" and replace them with the actual address of the variable, so these two instructions will get modified. If we compile this as a 64-bit code with full 64-bit address generation (-xcode=abs64) we get the following:

/* 000000          4 */         sethi   %hh(data),%o5
/* 0x0004 */ sethi %lm(data),%o2
/* 0x0008 */ or %o5,%hm(data),%o4
/* 0x000c */ sllx %o4,32,%o3
/* 0x0010 */ or %o3,%o2,%o1
/* 0x0014 */ retl ! Result = %o0
/* 0x0018 */ add %o1,%lo(data),%o0

So to do the same thing for a 64-bit application with full 64-bit address generation takes 6 instructions. Now, most hardware cannot address the full 64-bits, hardware typically can address somewhere around 40+ bits of address (example). So being able to generate a full 64-bit address is currently unnecessary. This is where abs44 comes in. A 44 bit address can be generated in four instructions, so slightly cuts the instruction count without practically compromising the range of memory that an application can address:

/* 000000          4 */         sethi   %h44(data),%o5
/* 0x0004 */ or %o5,%m44(data),%o4
/* 0x0008 */ sllx %o4,12,%o3
/* 0x000c */ retl ! Result = %o0
/* 0x0010 */ add %o3,%l44(data),%o0

Join the discussion

Comments ( 2 )
  • Peeter Joot Monday, April 23, 2012

    Has abs44 always been the default, or is this new to Solaris 11?

  • Darryl Gove Monday, April 23, 2012

    IIRC the default changed to abs44 in Studio 9.


Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.