What does -fPIC mean when building a shared library?


I know the '-fPIC' option has something to do with resolving addresses and independence between individual modules, but I'm not sure what it really means. Can you explain?

1/28/2013 8:26:44 AM

Accepted Answer

PIC stands for Position Independent Code

and to quote man gcc:

If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.

use this when building shared objects (*.so) on those mentioned architectures.

1/14/2014 3:26:15 PM

The f is the gcc prefix for options that "control the interface conventions used in code generation"

The PIC stands for "Position Independent Code", it is a specialization of the fpic for m68K and SPARC.

Edit: After reading page 11 of the document referenced by 0x6adb015, and the comment by coryan, I made a few changes:

This option only makes sense for shared libraries and you're telling the OS you're using a Global Offset Table, GOT. This means all your address references are relative to the GOT, and the code can be shared accross multiple processes.

Otherwise, without this option, the loader would have to modify all the offsets itself.

Needless to say, we almost always use -fpic/PIC.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow