nonetheless it won't help you still....there won't be PIC code, no matter how you substitute the mechanizm :?

even the RTL contains global vars and it uses them....and without PIC the application tries to access the absolute addresses (causing an AV)...under Win all is fine but under Unix-based systems all shared libraries can be relocated at any location in the memory, requring it to access global symbols by relative addresses, offsets from the GOT (Global Offset Table) which is passed by the loader I presume.....under Win, libraries have their imagebase, which is the preffered address at which the dll should be loaded....if it collides (the address is already occupied), the benefits of a dll is lost, all dll code is made private to the process (increasing the memory usage), reallocated at a different address and then loader by using the relocations table patches all the global offsets to reflect the new value...this is one of the reasons why certain programs take quite some time to load if they link with too many dlls which have conflicting image bases...under Unix-based systems there is no rellocation table and the loader does not patch addresses, that's why it requires the code to be PIC-safe and work without relying on its position in the memory....

maybe a bit too much information, but I hope it explains you how it works....