[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 H.J. Lu changed: What|Removed |Added Resolution|--- |FIXED Status|NEW |RESOLVED --- Comment #8 from H.J. Lu --- Fixed for 2.39 and 2.38 branch. -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 --- Comment #7 from cvs-commit at gcc dot gnu.org --- The binutils-2_38-branch branch has been updated by H.J. Lu : https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=caa6172de4b5100c9b45fd03eae714167a6085c1 commit caa6172de4b5100c9b45fd03eae714167a6085c1 Author: H.J. Lu Date: Wed Feb 9 15:51:22 2022 -0800 x86: Disallow invalid relocation against protected symbol I am checking this into master and will backport it to 2.38 branch. H.J On x86, GCC 12 supports -mno-direct-extern-access to enable canonical reference to protected function and disable copy relocation. With -mno-direct-extern-access, the canonical protected function symbols must be accessed via canonical reference and the protected data symbols in shared libraries are non-copyable. Under glibc 2.35, non-canonical reference to the canonical protected function will get the run-time error: ./y: internal_f: ./libfoo.so: non-canonical reference to canonical protected function and copy relocations against the non-copyable protected symbols will get the run-time error: ./x: internal_i: ./libfoo.so: copy relocation against non-copyable protected symbol Update x86 linker to disallow non-canonical reference to the canonical protected function: ld: plt.o: non-canonical reference to canonical protected function `internal_f' in libfoo.so ld: failed to set dynamic section sizes: bad value and copy relocation against the non-copyable protected symbol: ld: main.o: copy relocation against non-copyable protected symbol `internal_i' in libfoo.so at link-time. bfd/ PR ld/28875 * elf-properties.c (_bfd_elf_parse_gnu_properties): Don't skip shared libraries for GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS. * elf32-i386.c (elf_i386_scan_relocs): Disallow non-canonical reference to canonical protected function. * elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise. * elfxx-x86.c (elf_x86_allocate_dynrelocs): Don't allow copy relocation against non-copyable protected symbol. ld/ PR ld/28875 * testsuite/ld-i386/i386.exp: Check non-canonical reference to canonical protected function and check copy relocation against non-copyable protected symbol. * testsuite/ld-i386/pr21997-1.err: New file. * testsuite/ld-i386/pr28875.err: Likewise. * testsuite/ld-i386/pr28875a.c: Likewise. * testsuite/ld-i386/pr28875b.c: Likewise. * testsuite/ld-x86-64/pr21997-1a.err: Updated. * testsuite/ld-x86-64/pr21997-1b.err: Likewise. * testsuite/ld-x86-64/pr28875-data.err: New file. * testsuite/ld-x86-64/pr28875-func.err: Likewise. * testsuite/ld-x86-64/x86-64.exp: Check non-canonical reference to canonical protected function and check copy relocation against non-copyable protected symbol. (cherry picked from commit ebb191adac4ab45498dec0bfaac62f0a33537ba4) -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 --- Comment #6 from cvs-commit at gcc dot gnu.org --- The master branch has been updated by H.J. Lu : https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ebb191adac4ab45498dec0bfaac62f0a33537ba4 commit ebb191adac4ab45498dec0bfaac62f0a33537ba4 Author: H.J. Lu Date: Wed Feb 9 15:51:22 2022 -0800 x86: Disallow invalid relocation against protected symbol I am checking this into master and will backport it to 2.38 branch. H.J On x86, GCC 12 supports -mno-direct-extern-access to enable canonical reference to protected function and disable copy relocation. With -mno-direct-extern-access, the canonical protected function symbols must be accessed via canonical reference and the protected data symbols in shared libraries are non-copyable. Under glibc 2.35, non-canonical reference to the canonical protected function will get the run-time error: ./y: internal_f: ./libfoo.so: non-canonical reference to canonical protected function and copy relocations against the non-copyable protected symbols will get the run-time error: ./x: internal_i: ./libfoo.so: copy relocation against non-copyable protected symbol Update x86 linker to disallow non-canonical reference to the canonical protected function: ld: plt.o: non-canonical reference to canonical protected function `internal_f' in libfoo.so ld: failed to set dynamic section sizes: bad value and copy relocation against the non-copyable protected symbol: ld: main.o: copy relocation against non-copyable protected symbol `internal_i' in libfoo.so at link-time. bfd/ PR ld/28875 * elf-properties.c (_bfd_elf_parse_gnu_properties): Don't skip shared libraries for GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS. * elf32-i386.c (elf_i386_scan_relocs): Disallow non-canonical reference to canonical protected function. * elf64-x86-64.c (elf_x86_64_scan_relocs): Likewise. * elfxx-x86.c (elf_x86_allocate_dynrelocs): Don't allow copy relocation against non-copyable protected symbol. ld/ PR ld/28875 * testsuite/ld-i386/i386.exp: Check non-canonical reference to canonical protected function and check copy relocation against non-copyable protected symbol. * testsuite/ld-i386/pr21997-1.err: New file. * testsuite/ld-i386/pr28875.err: Likewise. * testsuite/ld-i386/pr28875a.c: Likewise. * testsuite/ld-i386/pr28875b.c: Likewise. * testsuite/ld-x86-64/pr21997-1a.err: Updated. * testsuite/ld-x86-64/pr21997-1b.err: Likewise. * testsuite/ld-x86-64/pr28875-data.err: New file. * testsuite/ld-x86-64/pr28875-func.err: Likewise. * testsuite/ld-x86-64/x86-64.exp: Check non-canonical reference to canonical protected function and check copy relocation against non-copyable protected symbol. -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 --- Comment #5 from Thiago Macieira --- (In reply to H.J. Lu from comment #4) > Created attachment 13971 [details] > The v2 patch > > I got > > /usr/gcc-12.0.1-x32/bin/gcc -B./ -o x main.o libfoo.so -Wl,-R,. > ./ld: main.o: non-canonical reference to canonical protected function > `internal_f' in libfoo.so > ./ld: failed to set dynamic section sizes: bad value > collect2: error: ld returned 1 exit status Confirmed: $ gcc main.cpp libb.so /home/tjmaciei/dev/gcc/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/ccTtYFXS.o: non-canonical reference to canonical protected function `_Z10internal_fv' in libb.so collect2: error: ld returned 1 exit status Uploading my Qt patch to make use of this. -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 H.J. Lu changed: What|Removed |Added Attachment #13964|0 |1 is obsolete|| --- Comment #4 from H.J. Lu --- Created attachment 13971 --> https://sourceware.org/bugzilla/attachment.cgi?id=13971&action=edit The v2 patch I got /usr/gcc-12.0.1-x32/bin/gcc -B./ -o x main.o libfoo.so -Wl,-R,. ./ld: main.o: non-canonical reference to canonical protected function `internal_f' in libfoo.so ./ld: failed to set dynamic section sizes: bad value collect2: error: ld returned 1 exit status -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 --- Comment #3 from Thiago Macieira --- That is, this patch brings BFD ld on par with Gold. The remaining issue for Gold is #28876. -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 --- Comment #2 from Thiago Macieira --- (In reply to H.J. Lu from comment #1) > Created attachment 13964 [details] > A patch > > Try this. Confirmed for copy relocations: $ cat main.cpp extern __attribute__((visibility("default"))) long internal_i; extern __attribute__((visibility("default"))) long internal_f(); int main() { internal_i = (long) &internal_f; return (long) &internal_f; } $ gcc main.cpp libb.so /home/tjmaciei/dev/gcc/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/ccwnIS4o.o: copy relocation against non-copyable protected symbol `internal_i' in libb.so collect2: error: ld returned 1 exit status But not for PLT entries: $ cat main2.cpp extern __attribute__((visibility("default"))) long internal_f(); int main() { return (long) &internal_f; } $ gcc main2.cpp libb.so [no error] $ objdump --no-show -Cdr a.out| sed -n '/:/,/^$/p' 00401126 : 401126: push %rbp 401127: mov%rsp,%rbp 40112a: mov$0x401030,%eax 40112f: pop%rbp 401130: ret glibc 2.35 does not complain about this binary by default: $ LD_LIBRARY_PATH=. ./a.out; printf %x\\n $? 30 Only if the PLT is processed: $ LD_BIND_NOW=1 LD_LIBRARY_PATH=. ./a.out ./a.out: _Z10internal_fv: ./libb.so: non-canonical reference to canonical protected function -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 H.J. Lu changed: What|Removed |Added Target Milestone|--- |2.39 -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 H.J. Lu changed: What|Removed |Added Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Assignee|unassigned at sourceware dot org |hjl.tools at gmail dot com Last reconfirmed||2022-02-10 --- Comment #1 from H.J. Lu --- Created attachment 13964 --> https://sourceware.org/bugzilla/attachment.cgi?id=13964&action=edit A patch Try this. -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 Andrew Pinski changed: What|Removed |Added See Also||https://gcc.gnu.org/bugzill ||a/show_bug.cgi?id=19520 -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 Andrew Pinski changed: What|Removed |Added CC||pinskia at gcc dot gnu.org See Also||https://gcc.gnu.org/bugzill ||a/show_bug.cgi?id=37611 -- You are receiving this mail because: You are on the CC list for the bug.
[Bug ld/28875] ld should warn or error out about creating copy relocs & direct external references for protected symbols
https://sourceware.org/bugzilla/show_bug.cgi?id=28875 H.J. Lu changed: What|Removed |Added CC||hjl.tools at gmail dot com -- You are receiving this mail because: You are on the CC list for the bug.