What do R_X86_64_32S and R_X86_64_64 relocation mean?

The R_X86_64_32S and R_X86_64_64 are names of relocation types, for code compiled for the amd64 architecture. You can look all of them up in the amd64 ABI.
According to it, R_X86_64_64 is broken down to:

  • R_X86_64 – all names are prefixed with this
  • 64 – Direct 64 bit relocation

and R_X86_64_32S to:

  • R_X86_64 – prefix
  • 32S – truncate value to 32 bits and sign-extend

which basically means “the value of the symbol pointed to by this relocation, plus any addend”, in both cases. For R_X86_64_32S the linker then verifies that the generated value sign-extends to the original 64-bit value.

Now, in an executable file, the code and data segments are given a specified virtual base address. The executable code is not shared, and each executable gets its own fresh address space. This means that the compiler knows exactly where the data section will be, and can reference it directly. Libraries, on the other hand, can only know that their data section will be at a specified offset from the base address; the value of that base address can only be known at runtime. Hence, all libraries must be produced with code that can execute no matter where it is put into memory, known as position independent code (or PIC for short).

Now when it comes to resolving your problem, the error message speaks for itself.

Leave a Comment