Use `-fPIC` or `-fpic` to generate position independent code. Whether to use `-fPIC` or `-fpic` to generate position independent code is target-dependent. The `-fPIC` choice always works, but may produce larger code than `-fpic` (mnemonic to remember this is that PIC is in a larger case, so it may produce larger amounts of code). Using `-fpic` option usually generates smaller and faster code, but will have platform-dependent limitations, such as the number of globally visible symbols or the size of the code. The linker will tell you whether it fits when you create the shared library. When in doubt, I choose `-fPIC`, because it always works.
When generating code for shared libraries, -fpic implies
-msmall-data and -fPIC implies -mlarge-data.
Where:
-msmall-data
-mlarge-data
When -mexplicit-relocs is in effect, static data is accessed
via gp-relative relocations. When -msmall-data is used,
objects 8 bytes long or smaller are placed in a small data
area (the ".sdata" and ".sbss" sections) and are accessed via
16-bit relocations off of the $gp register. This limits the
size of the small data area to 64KB, but allows the variables
to be directly accessed via a single instruction.
The default is -mlarge-data. With this option the data area
is limited to just below 2GB. Programs that require more
than 2GB of data must use "malloc" or "mmap" to allocate the
data in the heap instead of in the program's data segment.
When generating code for shared libraries, -fpic implies
-msmall-data and -fPIC implies -mlarge-data.