[fpc-devel] x86_64 linking issue (2.1.4)

Alan Krause alank at shermanloan.com
Fri May 25 18:50:02 CEST 2007


I posted a similar email to the fpc-pascal mailing list, but I am 
guessing that since the issue is somewhat complex, someone on this list 
might have a better understanding of what the underlying issue might be.

I have successfully ported a Delphi DLL to a compiled shared library 
under 32-bit linux using free pascal, and it works wonderfully. 
Yesterday, I decided to try and port it over to the x86_64 architecture 
on linux.

For the most part, everything went smoothly - there was a small issue 
which I resolved using PtrInt instead of integer, and all units now 
compile.

The problem arises when the linker attempts to put all the pieces 
together into one .so :

/usr/bin/ld: uCUNASP_CLCalc.o: relocation R_X86_64_32S against 
`U_UCUNASP_CLCALC_CUNASPCLSET' can not be used when making a shared 
object; recompile with -fPIC
uCUNASP_CLCalc.o: could not read symbols: Bad value

I have successfully created a shared library, so it is not an -fPIC 
issue (I think, and am compiling with the -Cg flag as well).

The CUNASPCLSET refers to a public unit-wide variable (a custom record 
type). If I redeclare the record type as an object and dynamically 
create the variable in the unit's initialization section (and free it up 
on finalization), then the error disappears, and a similar issue pops up 
with another record type in a different unit - I have also seen a 
similar error appear with a unit level array [0..10] of double.

Again - the code works fine on 32-bit linux, but not for x86_64. Does 
anyone have any ideas?

Thanks much,
 Alan Krause



More information about the fpc-devel mailing list