From 8ce8d223a716e16cd3ffd3aaa04d4dee7d35d4dd Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Mon, 3 Dec 2012 19:01:30 +0400 Subject: GNU binutils 2.22+ --- binutils/patches/156_pr10144.patch | 315 +++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 binutils/patches/156_pr10144.patch (limited to 'binutils/patches/156_pr10144.patch') 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 + + 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: -- cgit v1.2.3