## DP: Description: http://sourceware.org/ml/binutils/2010-09/msg00216.html 2010-09-15 Maciej W. Rozycki PR ld/10144 bfd/ * elfxx-mips.c (_bfd_mips_elf_check_relocs) [R_MIPS_32, R_MIPS_REL32, R_MIPS_64]: Ignore relocs from SEC_DEBUGGING sections. ld/testsuite/ * lib/ld-lib.exp (run_ld_link_tests): Handle sources from other directories. (run_ld_link_exec_tests): Likewise. (run_cc_link_tests): Likewise. * ld-elf/comm-data1.sd: New test. * ld-elf/comm-data1.s: Source for the new test. * ld-elf/comm-data2.sd: New test. * ld-elf/comm-data2.rd: Likewise. * ld-elf/comm-data2.xd: Likewise. * ld-elf/comm-data2.s: Source for the new tests. * ld-elf/comm-data.exp: Run the new tests. * ld-mips-elf/comm-data.exp: Likewise. --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data1.s @@ -0,0 +1,6 @@ + .section .rodata,"a",%progbits + .balign 8 + .globl foo + .type foo,%object +foo: + .skip 4, 0 --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data2.xd @@ -0,0 +1,2 @@ +Hex dump of section '\.debug_foo': + +0x0+ +00000000 00000000 00000000 00000000 +\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data2.s @@ -0,0 +1,14 @@ + .text + .globl _start + .globl __start +_start: +__start: + .comm foo, 4, 4 + .section .debug_foo,"",%progbits + .balign 16 + .ifdef ELF64 + .8byte foo + .else + .4byte foo + .endif + .balign 16 --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data.exp @@ -0,0 +1,76 @@ +# Expect script for common symbol override. +# +# Copyright 2010 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +# +# Written by Maciej W. Rozycki +# + +# Exclude non-ELF targets. +if ![is_elf_format] { + return +} + +# Exclude non-Linux targets; feel free to include your favourite one +# if you like. +if ![istarget *-*-linux*] { + return +} + +set testname "Common symbol override test" + +# Define a global symbol. +run_ld_link_tests [list \ + [list \ + "$testname (auxiliary shared object build)" \ + "-shared" \ + "" \ + { comm-data1.s } \ + { \ + { readelf -s comm-data1.sd } \ + } \ + "libcomm-data.so" \ + ] \ +] + +# Set the pointer size according to the ELF flavour. +set AFLAGS "" +if [is_elf64 "tmpdir/libcomm-data.so"] { + append AFLAGS " --defsym ELF64=1" +} + +# Verify that a common symbol has been converted to an undefined +# reference to the global symbol of the same name defined above +# and that the debug reference has been dropped. +run_ld_link_tests [list \ + [list \ + "$testname" \ + "-Ltmpdir -lcomm-data" \ + "$AFLAGS" \ + { comm-data2.s } \ + { \ + { readelf -s comm-data2.sd } \ + { readelf -r comm-data2.rd } \ + { readelf "-x .debug_foo" comm-data2.xd } \ + } \ + "comm-data" \ + ] \ +] --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data1.sd @@ -0,0 +1,10 @@ +Symbol table '\.dynsym' contains [0-9]+ entries: + +Num: +Value +Size +Type +Bind +Vis +Ndx +Name +#... + +[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +foo +#... +Symbol table '\.symtab' contains [0-9]+ entries: + +Num: +Value +Size +Type +Bind +Vis +Ndx +Name +#... + +[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +foo +#pass --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data2.rd @@ -0,0 +1 @@ +There are no relocations in this file\. --- /dev/null +++ b/ld/testsuite/ld-elf/comm-data2.sd @@ -0,0 +1,10 @@ +Symbol table '\.dynsym' contains [0-9]+ entries: + +Num: +Value +Size +Type +Bind +Vis +Ndx +Name +#... + +[0-9]+: +0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +foo +#... +Symbol table '\.symtab' contains [0-9]+ entries: + +Num: +Value +Size +Type +Bind +Vis +Ndx +Name +#... + +[0-9]+: +0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +foo +#pass --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -1252,11 +1252,12 @@ # Assemble each file in the test. foreach src_file $src_files { - set objfile "tmpdir/[file rootname $src_file].o" + set fileroot "[file rootname [file tail $src_file]]" + set objfile "tmpdir/$fileroot.o" lappend objfiles $objfile if { [file extension $src_file] == ".c" } { - set as_file "tmpdir/[file rootname $src_file].s" + set as_file "tmpdir/$fileroot.s" if ![ld_compile "$CC -S $CFLAGS $cflags" $srcdir/$subdir/$src_file $as_file] { set is_unresolved 1 break @@ -1446,7 +1447,8 @@ # Assemble each file in the test. foreach src_file $src_files { - set objfile "tmpdir/[file rootname $src_file].o" + set fileroot "[file rootname [file tail $src_file]]" + set objfile "tmpdir/$fileroot.o" lappend objfiles $objfile # We ignore warnings since some compilers may generate @@ -1565,7 +1567,8 @@ # Compile each file in the test. foreach src_file $src_files { - set objfile "tmpdir/[file rootname $src_file].o" + set fileroot "[file rootname [file tail $src_file]]" + set objfile "tmpdir/$fileroot.o" lappend objfiles $objfile # We ignore warnings since some compilers may generate --- /dev/null +++ b/ld/testsuite/ld-mips-elf/comm-data.exp @@ -0,0 +1,88 @@ +# Expect script for common symbol override, MIPS variation. +# +# Copyright 2010 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +# +# Written by Maciej W. Rozycki +# + +# Exclude non-ELF targets. +if ![is_elf_format] { + return +} + +# Exclude non-Linux targets; feel free to include your favourite one +# if you like. +if ![istarget mips*-*-linux*] { + return +} + +proc mips_comm_data_test { abi flag emul reloc } { + + set testname "MIPS $abi/$reloc common symbol override test" + set AFLAGS "$flag -EB" + set LDFLAGS "-m$emul" + + # Define a global symbol. + run_ld_link_tests [list \ + [list \ + "$testname (auxiliary shared object build)" \ + "$LDFLAGS -shared" \ + "$AFLAGS -call_shared" \ + { ../ld-elf/comm-data1.s } \ + { \ + { readelf -s ../ld-elf/comm-data1.sd } \ + } \ + "libmips-$abi-$reloc-comm-data.so" \ + ] \ + ] + + # Set the pointer size according to the ABI. + if { $abi == "n64" } { + append AFLAGS " --defsym ELF64=1" + } + + # Verify that a common symbol has been converted to an undefined + # reference to the global symbol of the same name defined above + # and that the debug reference has been dropped. + run_ld_link_tests [list \ + [list \ + "$testname" \ + "$LDFLAGS -z $reloc -Ltmpdir -lmips-$abi-$reloc-comm-data" \ + "$AFLAGS -call_nonpic" \ + { ../ld-elf/comm-data2.s } \ + { \ + { readelf -s ../ld-elf/comm-data2.sd } \ + { readelf -r ../ld-elf/comm-data2.rd } \ + { readelf "-x .debug_foo" ../ld-elf/comm-data2.xd } \ + } \ + "mips-$abi-$reloc-comm-data" \ + ] \ + ] +} + +set abis { o32 -32 elf32btsmip n32 -n32 elf32btsmipn32 n64 -64 elf64btsmip } +set relocs { copyreloc nocopyreloc } +foreach { abi flag emul } $abis { + foreach reloc $relocs { + mips_comm_data_test $abi $flag $emul $reloc + } +} --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -7583,6 +7583,19 @@ elf_hash_table (info)->dynobj = dynobj = abfd; break; } + /* Ignore relocs from SEC_DEBUGGING sections because such + sections are not SEC_ALLOC and thus ld.so will not process + them. Don't set has_static_relocs for the corresponding + symbol. + + This is needed in cases such as a global symbol definition + in a shared library causing a common symbol from an object + file to be converted to an undefined reference. If that + happens, then all the relocations against this symbol from + SEC_DEBUGGING sections in the object file will resolve to + nil. */ + if ((sec->flags & SEC_DEBUGGING) != 0) + break; /* Fall through. */ default: