summaryrefslogtreecommitdiff
path: root/binutils/patches/156_pr10144.patch
diff options
context:
space:
mode:
Diffstat (limited to 'binutils/patches/156_pr10144.patch')
-rw-r--r--binutils/patches/156_pr10144.patch315
1 files changed, 315 insertions, 0 deletions
diff --git a/binutils/patches/156_pr10144.patch b/binutils/patches/156_pr10144.patch
new file mode 100644
index 0000000..145d19b
--- /dev/null
+++ b/binutils/patches/156_pr10144.patch
@@ -0,0 +1,315 @@
+## DP: Description: http://sourceware.org/ml/binutils/2010-09/msg00216.html
+
+2010-09-15 Maciej W. Rozycki <macro@codesourcery.com>
+
+ 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 <macro@codesourcery.com>
++#
++
++# 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 <macro@codesourcery.com>
++#
++
++# 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: