Recently, after I upgrade gcc
on my Arch Linux
, I find it has enabled “--enable-default-pie
” option by default:
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp
Thread model: posix
gcc version 7.1.1 20170630 (GCC)
One consequence of this enhancement is you should rebuild the static libraries which you projects depend on, otherwise you may counter totally confused link errors like this:
relocation R_X86_64_32S against `.text’ can not be used when making a shared object; recompile with -fPIC
A caveat you must pay attention to is if your static library has assembly code object which is not position independent, you must specify “-no-pie
” option during link stage of generating final executable binary. This issue let me spend half day to debug, so it is a really good habit to check critical packages’ change log, such as your compiler.
Reference:
PIE.
F*ck-a-doodle-doo! It took me a bleeding day to solve this problem.
Thank you so, so, so much for your post 🙂
Me too. Thanks a lot for posting this. This solved my issue as well.
gcc -no-pie -o test program.o
This helped me!
I was able to find good advice from your articles.|
Thank you for posting, I’ve solved own issue (also spent a half day until found this..)