Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2011-06

Linux i386 libraries and PIC

8 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ludo Brands

Dear all,

I'm trying to create a library on linux i386 that contains only PIC code. The library is a driver that runs unconfined causing SELinux (Fedora) to block the loading of the library.
The library is compiled with -fPIC but eu-findtextrel reports a lot of relocations (4933 in my library and 3852 in a small testlibrary). The problem seems to be that the RTL isn't compiled with -fPIC. And that is where I need your help. Here is what I tried so far (fpc 2.5.1 svn 17622):
1) (bootstrap compiler 2.4.4)
make clean all OPT="-fPIC"
--> EAccessViolation when compiling system.pp with ppc386 (the bootstrap)

2) (bootstrap compiler 2.5.1 build with make clean all) make clean all OPT="-fPIC" PP=/path/to/2.5.1/compiler --> EAccessViolation when compiling ../unix/classes with ppc1

Compiler doesn't need to be PIC. So try rebuilding rtl only.

3) (fpc 2.4.4)
make clean all OPT="-g -gw"
cd rtl
make clean OPT="-fPIC -g -gw"
--> EAccessViolation when compiling system.pp

4) (still in dir rtl)
make clean OPT="-fPIC -g -gw" PP=/path/to/2.5.1/compiler cd ..
sudo make install
--> changed checksum for system.pp, recompile cairo, can't find unit cairo

5)
sudo make install OPT="-Fu/path/to/svn/packages/*/src/" PP=/path/to/2.5.1/compiler
sudo make sourceinstall PP=/path/to/2.5.1/compiler

All OK. RTL should be PIC now. Rebuild testlibrary. Result from eu-findtextrel 38: relocations for the testproject. Much, much better, but not zero :(
Although the compiler (and the testproject) was build with -g -gw, eu-findtextrel doesn't provide any usefull info on the relocation. It only says "the file containing the function 'test' might not be compiled with -fpic/-fPIC" for avery relocation found.
eu-readelf -r shows 9692 386_relative and 4 386_JMP_SLOT type relocations.

What did I do wrong? Or is a rtl PIC not enough?

BTW. Linux x64 works perfectly. 0 relocations and a happy SELinux.

Thanks, Ludo

Ludo Brands
to Felipe Monteiro de Carvalho

The system.pp checksum changed caused most, if not all, units to be recompiled in the make install. The fcl units I checked have all a newer date than the rtl units. I also reduced my testlibrary to not include any units (no uses) and it still has 4 relocations.

Ludo

Show quoted text 18 lines
-----Message d'origine----- De : De la part de Felipe Monteiro de Carvalho Envoyé : mercredi 1 juin 2011 15:42 À : FPC-Pascal users discussions Objet : Re: [fpc-pascal] Linux i386 libraries and PIC Maybe you are using something from the FCL, so you would need to rebuild that too -- Felipe Monteiro de Carvalho _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Ludo Brands: I'm trying to create a library on linux i386 that contains only PIC code. The library is…

I also tried 1) and 2) with "-fPIC -Aas" as suggested in some PIC related bug reports but they crash at same point.

Show quoted text 9 lines
1) (bootstrap compiler 2.4.4) make clean all OPT="-fPIC" --> EAccessViolation when compiling system.pp with ppc386 (the --> bootstrap) 2) (bootstrap compiler 2.5.1 build with make clean all) make clean all OPT="-fPIC" PP=/path/to/2.5.1/compiler --> EAccessViolation when compiling ../unix/classes with ppc1
Ludo Brands
to Ludo Brands: I'm trying to create a library on linux i386 that contains only PIC code. The library is…

Scanelf -qT gives more information:

libtestpic.so: (memory/data?) [0x241B7] in (optimized out: previous _$SYSTEM$_Ld159) [0x241B4]
libtestpic.so: (memory/data?) [0x24397] in (optimized out: previous .La330) [0x24383]
libtestpic.so: (memory/data?) [0x24577] in (optimized out: previous .La337) [0x24555]
libtestpic.so: (memory/data?) [0x35318] in (optimized out: previous _$CLASSES$_Ld454) [0x350BE]
libtestpic.so: (memory/data?) [0x48465] in (optimized out: previous .La29) [0x4844C]
libtestpic.so: (memory/data?) [0x6201E] in (optimized out: previous SYSUTILS_FORMAT$ANSISTRING$array_of_const$$ANSISTRING) [0x62000] libtestpic.so: (memory/data?) [0x62168] in (optimized out: previous SYSUTILS_FORMATBUF$formal$LONGWORD$formal$LONGWORD$array_of_const$$LONGWORD) [0x62140]
libtestpic.so: (memory/data?) [0x62261] in (optimized out: previous SYSUTILS_FMTSTR$ANSISTRING$ANSISTRING$array_of_const) [0x62240] libtestpic.so: (memory/data?) [0x622A1] in (optimized out: previous SYSUTILS_STRFMT$PCHAR$PCHAR$array_of_const$$PCHAR) [0x62280] libtestpic.so: (memory/data?) [0x62345] in (optimized out: previous SYSUTILS_STRLFMT$PCHAR$LONGWORD$PCHAR$array_of_const$$PCHAR) [0x62320] libtestpic.so: (memory/data?) [0x626AE] in (optimized out: previous DBG_BASEUNIX_TRLIMIT) [0x626A7]
libtestpic.so: (memory/data?) [0x640EC] in (optimized out: previous SYSUTILS_FLOATTOTEXT$PCHAR$EXTENDED$TFLOATFORMAT$LONGINT$LONGINT$$LONGINT) [0x640C0]
libtestpic.so: (memory/data?) [0x64179] in (optimized out: previous SYSUTILS_FLOATTOSTRF$EXTENDED$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64150]
libtestpic.so: (memory/data?) [0x64204] in (optimized out: previous SYSUTILS_FLOATTOSTRF$CURRENCY$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x641E0]
libtestpic.so: (memory/data?) [0x642AE] in (optimized out: previous SYSUTILS_FLOATTOSTRF$DOUBLE$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64280]
libtestpic.so: (memory/data?) [0x64341] in (optimized out: previous SYSUTILS_FLOATTOSTRF$SINGLE$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64320]
libtestpic.so: (memory/data?) [0x643D4] in (optimized out: previous SYSUTILS_FLOATTOSTRF$COMP$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x643B0]
libtestpic.so: (memory/data?) [0x64474] in (optimized out: previous SYSUTILS_FLOATTOSTRF$INT64$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64450]
libtestpic.so: (memory/data?) [0x68E78] in (optimized out: previous SYSUTILS_STRTODATE$PCHAR$LONGINT$ANSISTRING$CHAR$$TDATETIME) [0x68E30] libtestpic.so: (memory/data?) [0x69995] in (optimized out: previous SYSUTILS_STRTOTIME$PCHAR$LONGINT$CHAR$$TDATETIME) [0x69950] libtestpic.so: (memory/data?) [0x6AFC8] in (optimized out: previous SYSUTILS_TRYSTRTODATE$SHORTSTRING$TDATETIME$ANSISTRING$CHAR$$BOOLEAN) [0x6AF80]
libtestpic.so: (memory/data?) [0x6B0A0] in (optimized out: previous SYSUTILS_TRYSTRTODATE$ANSISTRING$TDATETIME$ANSISTRING$CHAR$$BOOLEAN) [0x6B040]
libtestpic.so: (memory/data?) [0x6B305] in (optimized out: previous SYSUTILS_TRYSTRTOTIME$SHORTSTRING$TDATETIME$CHAR$$BOOLEAN) [0x6B2C0] libtestpic.so: (memory/data?) [0x6B40D] in (optimized out: previous SYSUTILS_TRYSTRTOTIME$ANSISTRING$TDATETIME$CHAR$$BOOLEAN) [0x6B3B0] libtestpic.so: (memory/data?) [0x6E36E] in (optimized out: previous SYSUTILS_WIDEFORMAT$WIDESTRING$array_of_const$$WIDESTRING) [0x6E350] libtestpic.so: (memory/data?) [0x6E4B8] in (optimized out: previous SYSUTILS_WIDEFORMATBUF$formal$LONGWORD$formal$LONGWORD$array_of_const$$LONGW ORD) [0x6E490]
libtestpic.so: (memory/data?) [0x6E5B1] in (optimized out: previous SYSUTILS_WIDEFMTSTR$WIDESTRING$WIDESTRING$array_of_const) [0x6E590] libtestpic.so: (memory/data?) [0x6FEFE] in (optimized out: previous SYSUTILS_UNICODEFORMAT$UNICODESTRING$array_of_const$$UNICODESTRING) [0x6FEE0]
libtestpic.so: (memory/data?) [0x70048] in (optimized out: previous SYSUTILS_UNICODEFORMATBUF$formal$LONGWORD$formal$LONGWORD$array_of_const$$LO NGWORD) [0x70020]
libtestpic.so: (memory/data?) [0x70141] in (optimized out: previous SYSUTILS_UNICODEFMTSTR$UNICODESTRING$UNICODESTRING$array_of_const) [0x70120] libtestpic.so: (memory/data?) [0x7116B] in (optimized out: previous SYSUTILS_SUPPORTS$IUNKNOWN$TCLASS$formal$$BOOLEAN) [0x71140] libtestpic.so: (memory/data?) [0x7BF23] in (optimized out: previous UNIX_READTIMEZONEFILE$SHORTSTRING) [0x7BE50]
libtestpic.so: (memory/data?) [0x7EC41] in (optimized out: previous BASEUNIX_FPGETENV$SHORTSTRING$$PCHAR) [0x7EC10]
libtestpic.so: (memory/data?) [0x80C64] in (optimized out: previous BASEUNIX_FPOPEN$SHORTSTRING$LONGINT$$LONGINT) [0x80C30] libtestpic.so: (memory/data?) [0x80CD7] in (optimized out: previous BASEUNIX_FPOPEN$SHORTSTRING$LONGINT$LONGWORD$$LONGINT) [0x80CA0] libtestpic.so: (memory/data?) [0x80DB1] in (optimized out: previous BASEUNIX_FPOPENDIR$SHORTSTRING$$PDIR) [0x80D80]
libtestpic.so: (memory/data?) [0x80E24] in (optimized out: previous BASEUNIX_FPSTAT$SHORTSTRING$STAT$$LONGINT) [0x80DF0] libtestpic.so: (memory/data?) [0x8162C] in (optimized out: previous UNIXUTIL_STRINGTOPPCHAR$SHORTSTRING$SMALLINT$$PPCHAR) [0x81610] libtestpic.so

AFAIK these are all part of the rtl. Why are only these remaining?

Show quoted text 70 lines
-----Message d'origine----- De : De la part de Ludo Brands Envoyé : mercredi 1 juin 2011 15:23 À : 'FPC-Pascal users discussions' Objet : [fpc-pascal] Linux i386 libraries and PIC Dear all, I'm trying to create a library on linux i386 that contains only PIC code. The library is a driver that runs unconfined causing SELinux (Fedora) to block the loading of the library. The library is compiled with -fPIC but eu-findtextrel reports a lot of relocations (4933 in my library and 3852 in a small testlibrary). The problem seems to be that the RTL isn't compiled with -fPIC. And that is where I need your help. Here is what I tried so far (fpc 2.5.1 svn 17622): 1) (bootstrap compiler 2.4.4) make clean all OPT="-fPIC" --> EAccessViolation when compiling system.pp with ppc386 (the --> bootstrap) 2) (bootstrap compiler 2.5.1 build with make clean all) make clean all OPT="-fPIC" PP=/path/to/2.5.1/compiler --> EAccessViolation when compiling ../unix/classes with ppc1 Compiler doesn't need to be PIC. So try rebuilding rtl only. 3) (fpc 2.4.4) make clean all OPT="-g -gw" cd rtl make clean OPT="-fPIC -g -gw" --> EAccessViolation when compiling system.pp 4) (still in dir rtl) make clean OPT="-fPIC -g -gw" PP=/path/to/2.5.1/compiler cd .. sudo make install --> changed checksum for system.pp, recompile cairo, can't find unit --> cairo 5) sudo make install OPT="-Fu/path/to/svn/packages/*/src/" PP=/path/to/2.5.1/compiler sudo make sourceinstall PP=/path/to/2.5.1/compiler All OK. RTL should be PIC now. Rebuild testlibrary. Result from eu-findtextrel 38: relocations for the testproject. Much, much better, but not zero :( Although the compiler (and the testproject) was build with -g -gw, eu-findtextrel doesn't provide any usefull info on the relocation. It only says "the file containing the function 'test' might not be compiled with -fpic/-fPIC" for avery relocation found. eu-readelf -r shows 9692 386_relative and 4 386_JMP_SLOT type relocations. What did I do wrong? Or is a rtl PIC not enough? BTW. Linux x64 works perfectly. 0 relocations and a happy SELinux. Thanks, Ludo _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Ludo Brands

Ran gdb to find out what happens on the addresses listed below.

In systutils, most are push imm32 DefaultFormatSettings (sysstr.inc). DefaultFormatSettings is defined in sysinth.inc where it's declaration is followed by Formatsettings : TFormatSettings absolute DefaultFormatSettings; . Is the absolute directive known to cause PIC problems?

SYSUTILS_SUPPORTS$IUNKNOWN$TCLASS$formal$$BOOLEAN does a push imm32 IObjectInstance defined in objpash.inc.

The BASEUNIX_x (bunxovl.inc) make an absolute reference to the #0 string in
path:=path+#0;!!!

Any clues???

Show quoted text 190 lines
-----Message d'origine----- De : De la part de Ludo Brands Envoyé : mercredi 1 juin 2011 17:17 À : 'FPC-Pascal users discussions' Objet : RE : [fpc-pascal] Linux i386 libraries and PIC Scanelf -qT gives more information: libtestpic.so: (memory/data?) [0x241B7] in (optimized out: previous _$SYSTEM$_Ld159) [0x241B4] libtestpic.so: (memory/data?) [0x24397] in (optimized out: previous .La330) [0x24383] libtestpic.so: (memory/data?) [0x24577] in (optimized out: previous .La337) [0x24555] libtestpic.so: (memory/data?) [0x35318] in (optimized out: previous _$CLASSES$_Ld454) [0x350BE] libtestpic.so: (memory/data?) [0x48465] in (optimized out: previous .La29) [0x4844C] libtestpic.so: (memory/data?) [0x6201E] in (optimized out: previous SYSUTILS_FORMAT$ANSISTRING$array_of_const$$ANSISTRING) [0x62000] libtestpic.so: (memory/data?) [0x62168] in (optimized out: previous SYSUTILS_FORMATBUF$formal$LONGWORD$formal$LONGWORD$array_of_co nst$$LONGWORD) [0x62140] libtestpic.so: (memory/data?) [0x62261] in (optimized out: previous SYSUTILS_FMTSTR$ANSISTRING$ANSISTRING$array_of_const) [0x62240] libtestpic.so: (memory/data?) [0x622A1] in (optimized out: previous SYSUTILS_STRFMT$PCHAR$PCHAR$array_of_const$$PCHAR) [0x62280] libtestpic.so: (memory/data?) [0x62345] in (optimized out: previous SYSUTILS_STRLFMT$PCHAR$LONGWORD$PCHAR$array_of_const$$PCHAR) [0x62320] libtestpic.so: (memory/data?) [0x626AE] in (optimized out: previous DBG_BASEUNIX_TRLIMIT) [0x626A7] libtestpic.so: (memory/data?) [0x640EC] in (optimized out: previous SYSUTILS_FLOATTOTEXT$PCHAR$EXTENDED$TFLOATFORMAT$LONGINT$LONGI NT$$LONGINT) [0x640C0] libtestpic.so: (memory/data?) [0x64179] in (optimized out: previous SYSUTILS_FLOATTOSTRF$EXTENDED$TFLOATFORMAT$LONGINT$LONGINT$$AN SISTRING) [0x64150] libtestpic.so: (memory/data?) [0x64204] in (optimized out: previous SYSUTILS_FLOATTOSTRF$CURRENCY$TFLOATFORMAT$LONGINT$LONGINT$$AN SISTRING) [0x641E0] libtestpic.so: (memory/data?) [0x642AE] in (optimized out: previous SYSUTILS_FLOATTOSTRF$DOUBLE$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64280] libtestpic.so: (memory/data?) [0x64341] in (optimized out: previous SYSUTILS_FLOATTOSTRF$SINGLE$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64320] libtestpic.so: (memory/data?) [0x643D4] in (optimized out: previous SYSUTILS_FLOATTOSTRF$COMP$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x643B0] libtestpic.so: (memory/data?) [0x64474] in (optimized out: previous SYSUTILS_FLOATTOSTRF$INT64$TFLOATFORMAT$LONGINT$LONGINT$$ANSISTRING) [0x64450] libtestpic.so: (memory/data?) [0x68E78] in (optimized out: previous SYSUTILS_STRTODATE$PCHAR$LONGINT$ANSISTRING$CHAR$$TDATETIME) [0x68E30] libtestpic.so: (memory/data?) [0x69995] in (optimized out: previous SYSUTILS_STRTOTIME$PCHAR$LONGINT$CHAR$$TDATETIME) [0x69950] libtestpic.so: (memory/data?) [0x6AFC8] in (optimized out: previous SYSUTILS_TRYSTRTODATE$SHORTSTRING$TDATETIME$ANSISTRING$CHAR$$BOOLEAN) [0x6AF80] libtestpic.so: (memory/data?) [0x6B0A0] in (optimized out: previous SYSUTILS_TRYSTRTODATE$ANSISTRING$TDATETIME$ANSISTRING$CHAR$$BOOLEAN) [0x6B040] libtestpic.so: (memory/data?) [0x6B305] in (optimized out: previous SYSUTILS_TRYSTRTOTIME$SHORTSTRING$TDATETIME$CHAR$$BOOLEAN) [0x6B2C0] libtestpic.so: (memory/data?) [0x6B40D] in (optimized out: previous SYSUTILS_TRYSTRTOTIME$ANSISTRING$TDATETIME$CHAR$$BOOLEAN) [0x6B3B0] libtestpic.so: (memory/data?) [0x6E36E] in (optimized out: previous SYSUTILS_WIDEFORMAT$WIDESTRING$array_of_const$$WIDESTRING) [0x6E350] libtestpic.so: (memory/data?) [0x6E4B8] in (optimized out: previous SYSUTILS_WIDEFORMATBUF$formal$LONGWORD$formal$LONGWORD$array_o f_const$$LONGW ORD) [0x6E490] libtestpic.so: (memory/data?) [0x6E5B1] in (optimized out: previous SYSUTILS_WIDEFMTSTR$WIDESTRING$WIDESTRING$array_of_const) [0x6E590] libtestpic.so: (memory/data?) [0x6FEFE] in (optimized out: previous SYSUTILS_UNICODEFORMAT$UNICODESTRING$array_of_const$$UNICODESTRING) [0x6FEE0] libtestpic.so: (memory/data?) [0x70048] in (optimized out: previous SYSUTILS_UNICODEFORMATBUF$formal$LONGWORD$formal$LONGWORD$arra y_of_const$$LO NGWORD) [0x70020] libtestpic.so: (memory/data?) [0x70141] in (optimized out: previous SYSUTILS_UNICODEFMTSTR$UNICODESTRING$UNICODESTRING$array_of_co nst) [0x70120] libtestpic.so: (memory/data?) [0x7116B] in (optimized out: previous SYSUTILS_SUPPORTS$IUNKNOWN$TCLASS$formal$$BOOLEAN) [0x71140] libtestpic.so: (memory/data?) [0x7BF23] in (optimized out: previous UNIX_READTIMEZONEFILE$SHORTSTRING) [0x7BE50] libtestpic.so: (memory/data?) [0x7EC41] in (optimized out: previous BASEUNIX_FPGETENV$SHORTSTRING$$PCHAR) [0x7EC10] libtestpic.so: (memory/data?) [0x80C64] in (optimized out: previous BASEUNIX_FPOPEN$SHORTSTRING$LONGINT$$LONGINT) [0x80C30] libtestpic.so: (memory/data?) [0x80CD7] in (optimized out: previous BASEUNIX_FPOPEN$SHORTSTRING$LONGINT$LONGWORD$$LONGINT) [0x80CA0] libtestpic.so: (memory/data?) [0x80DB1] in (optimized out: previous BASEUNIX_FPOPENDIR$SHORTSTRING$$PDIR) [0x80D80] libtestpic.so: (memory/data?) [0x80E24] in (optimized out: previous BASEUNIX_FPSTAT$SHORTSTRING$STAT$$LONGINT) [0x80DF0] libtestpic.so: (memory/data?) [0x8162C] in (optimized out: previous UNIXUTIL_STRINGTOPPCHAR$SHORTSTRING$SMALLINT$$PPCHAR) [0x81610] libtestpic.so AFAIK these are all part of the rtl. Why are only these remaining? > -----Message d'origine----- > De : > De la part > de Ludo Brands > Envoyé : mercredi 1 juin 2011 15:23 > À : 'FPC-Pascal users discussions' > Objet : [fpc-pascal] Linux i386 libraries and PIC > > > Dear all, > > I'm trying to create a library on linux i386 that contains > only PIC code. The library is a driver that runs unconfined > causing SELinux (Fedora) to block the loading of the library. > The library is compiled with -fPIC but eu-findtextrel reports > a lot of relocations (4933 in my library and 3852 in a small > testlibrary). The problem seems to be that the RTL isn't > compiled with -fPIC. And that is where I need your help. Here > is what I tried so far (fpc 2.5.1 svn 17622): > 1) (bootstrap compiler 2.4.4) > make clean all OPT="-fPIC" > --> EAccessViolation when compiling system.pp with ppc386 (the > --> bootstrap) > > 2) (bootstrap compiler 2.5.1 build with make clean all) > make clean all OPT="-fPIC" PP=/path/to/2.5.1/compiler > --> EAccessViolation when compiling ../unix/classes with ppc1 > > Compiler doesn't need to be PIC. So try rebuilding rtl only. > > 3) (fpc 2.4.4) > make clean all OPT="-g -gw" > cd rtl > make clean OPT="-fPIC -g -gw" > --> EAccessViolation when compiling system.pp > > 4) (still in dir rtl) > make clean OPT="-fPIC -g -gw" PP=/path/to/2.5.1/compiler > cd .. > sudo make install > --> changed checksum for system.pp, recompile cairo, can't find unit > --> cairo > > 5) > sudo make install OPT="-Fu/path/to/svn/packages/*/src/" > PP=/path/to/2.5.1/compiler > sudo make sourceinstall PP=/path/to/2.5.1/compiler > > All OK. RTL should be PIC now. Rebuild testlibrary. Result > from eu-findtextrel 38: relocations for the testproject. > Much, much better, but not zero :( Although the compiler (and > the testproject) was build with -g -gw, eu-findtextrel > doesn't provide any usefull info on the relocation. It only > says "the file containing the function 'test' might not be > compiled with -fpic/-fPIC" for avery relocation found. > eu-readelf -r shows 9692 386_relative and 4 386_JMP_SLOT > type relocations. > > What did I do wrong? Or is a rtl PIC not enough? > > BTW. Linux x64 works perfectly. 0 relocations and a happy SELinux. > > Thanks, Ludo > > > > _______________________________________________ > fpc-pascal maillist - > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Ludo Brands
to Ludo Brands: Ran gdb to find out what happens on the addresses listed below. In systutils, most are…
Show quoted text 7 lines
In systutils, most are push imm32 DefaultFormatSettings (sysstr.inc). DefaultFormatSettings is defined in sysinth.inc where it's declaration is followed by Formatsettings : TFormatSettings absolute DefaultFormatSettings; . Is the absolute directive known to cause PIC problems?

Absolute isn't the cause. Looking at the assembler code created by fpc I figured out that when DefaultFormatSettings is passed to a routine as a register it is correctly loaded in a register as
(%EBX) while when it is pushed on the
stack because of too many params it is pushed as
$TC_SYSUTILS_DEFAULTFORMATSETTINGS which is wrong.

I'll create a bug report.

Ludo