https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86517
Bug ID: 86517 Summary: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object with LTO Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org CC: hubicka at gcc dot gnu.org, marxin at gcc dot gnu.org Target Milestone: --- When mixing PIE and PIC one gets: $ cat 1.i int key_thread_attempt_id ; int main() { } $ cat 2.i void get_ioctl_ops(); void a() { get_ioctl_ops(); } $ cat lib.i void open_fd(char *); void init_ioctl_ctl() { open_fd(""); } void get_ioctl_ops() {} $ gcc -flto -c -fPIE -O2 1.i 2.i && gcc -fPIC -c -O2 lib.i -flto && ar rv x.a lib.o && gcc -pie -O2 -pthread -ldl -lxml2 1.o 2.o x.a -rdynamic -flto=9 -shared r - lib.o /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: /tmp/cctTbHed.ltrans0.ltrans.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC /usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status Without LTO it works fine: $ gcc -c -fPIE -O2 1.i 2.i && gcc -fPIC -c -O2 lib.i && ar rv x.a lib.o && gcc -pie -O2 -pthread -ldl -lxml2 1.o 2.o x.a -rdynamic -shared Note that usage -shared is trick how I was able to reduce number of object files. But original test-case does not use it.