binutils: Backport emulation template fixes
authorKhem Raj <raj.khem@gmail.com>
Thu, 27 Jun 2013 06:52:59 +0000 (23:52 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 5 Jul 2013 14:34:26 +0000 (15:34 +0100)
This fixes the linking errors seen on mips64 when linking
sln/ from eglibc 2.18

 /builds1/angstrom/build/tmp-angstrom_next-eglibc/sysroots/x86_64-linux/usr/libexec/mips64-angstrom-linux.gcc-cross-initial/gcc/mips64-angstrom-linux/4.8.1/ld:
BFD (GNU Binutils) 2.23.2 assertion fail
/builds1/angstrom/build/tmp-angstrom_next-eglibc/work/mips64-angstrom-linux/binutils-cross/2.23.2-r4/binutils-2.23.2/bfd/elfxx-mips.c:3453
| collect2: error: ld returned 1 exit status

(From OE-Core rev: eda721f0c85afa30c2b3030ef76522cc3451af21)

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-devtools/binutils/binutils-2.23.2.inc
meta/recipes-devtools/binutils/binutils-2.23.2/backport/0001-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch [new file with mode: 0644]
meta/recipes-devtools/binutils/binutils-2.23.2/backport/0002-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch [new file with mode: 0644]
meta/recipes-devtools/binutils/binutils-2.23.2/backport/0003-gold.patch [new file with mode: 0644]

index f5b5a99..99fe2e5 100644 (file)
@@ -43,6 +43,9 @@ BACKPORT = "\
      file://backport/aarch64-movi.patch \
      file://backport/0001-config-tc-ppc.c-PPC_VLE_SPLIT16A-Delete-unused-macro.patch \
      file://backport/0002-config-tc-ppc.c-md_apply_fix-Sign-extend-fieldval-un.patch \
+     file://backport/0001-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch \
+     file://backport/0002-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch \
+     file://backport/0003-gold.patch \
 "
 SRC_URI[md5sum] = "4f8fa651e35ef262edc01d60fb45702e"
 SRC_URI[sha256sum] = "fe914e56fed7a9ec2eb45274b1f2e14b0d8b4f41906a5194eac6883cfe5c1097"
diff --git a/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0001-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch b/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0001-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch
new file mode 100644 (file)
index 0000000..050450f
--- /dev/null
@@ -0,0 +1,31 @@
+From 4c147afe1796611c431aa86ea12342c1d80c2c4b Mon Sep 17 00:00:00 2001
+From: "Maciej W. Rozycki" <macro@linux-mips.org>
+Date: Wed, 1 May 2013 17:18:43 +0000
+Subject: [PATCH]       * emultempl/elf32.em
+ (gld${EMULATION_NAME}_before_allocation):     Use
+ is_elf_hash_table rather than a handcoded condition.
+
+---
+ ld/ChangeLog          |    5 +++++
+ ld/emultempl/elf32.em |    2 +-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+2013-05-01  Maciej W. Rozycki  <macro@codesourcery.com>
+
+       * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
+       Use is_elf_hash_table rather than a handcoded condition.
+
+Upstream-Status: Backport
+Index: binutils-2.23.2/ld/emultempl/elf32.em
+===================================================================
+--- binutils-2.23.2.orig/ld/emultempl/elf32.em 2013-06-26 23:29:32.000000000 -0700
++++ binutils-2.23.2/ld/emultempl/elf32.em      2013-06-26 23:35:45.798428256 -0700
+@@ -1494,7 +1494,7 @@
+   asection *sinterp;
+   bfd *abfd;
+-  if (link_info.hash->type == bfd_link_elf_hash_table)
++  if (is_elf_hash_table (link_info.hash))
+     _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
+   /* If we are going to make any variable assignments, we need to let
diff --git a/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0002-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch b/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0002-emultempl-elf32.em-gld-EMULATION_NAME-_before_alloca.patch
new file mode 100644 (file)
index 0000000..36e5924
--- /dev/null
@@ -0,0 +1,43 @@
+From b0d2b7b6eae7b7f4fbfd1695d4d2f1b45198d597 Mon Sep 17 00:00:00 2001
+From: "Maciej W. Rozycki" <macro@linux-mips.org>
+Date: Fri, 3 May 2013 15:01:19 +0000
+Subject: [PATCH]       * emultempl/elf32.em
+ (gld${EMULATION_NAME}_before_allocation):     Only call
+ lang_for_each_statement if an ELF hash table is used.
+
+---
+ ld/ChangeLog          |    5 +++++
+ ld/emultempl/elf32.em |   12 +++++++-----
+ 2 files changed, 12 insertions(+), 5 deletions(-)
+
+2013-05-03  Alan Modra  <amodra@gmail.com>
+
+       * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
+       Only call lang_for_each_statement if an ELF hash table is used.
+
+Upstream-Status: Backport
+
+Index: binutils-2.23.2/ld/emultempl/elf32.em
+===================================================================
+--- binutils-2.23.2.orig/ld/emultempl/elf32.em 2013-06-26 23:35:45.000000000 -0700
++++ binutils-2.23.2/ld/emultempl/elf32.em      2013-06-26 23:37:04.530429733 -0700
+@@ -1495,12 +1495,14 @@
+   bfd *abfd;
+   if (is_elf_hash_table (link_info.hash))
+-    _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
++    {
++      _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
+-  /* If we are going to make any variable assignments, we need to let
+-     the ELF backend know about them in case the variables are
+-     referred to by dynamic objects.  */
+-  lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
++      /* If we are going to make any variable assignments, we need to
++       let the ELF backend know about them in case the variables are
++       referred to by dynamic objects.  */
++      lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
++    }
+   /* Let the ELF backend work out the sizes of any sections required
+      by dynamic linking.  */
diff --git a/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0003-gold.patch b/meta/recipes-devtools/binutils/binutils-2.23.2/backport/0003-gold.patch
new file mode 100644 (file)
index 0000000..141e66b
--- /dev/null
@@ -0,0 +1,203 @@
+From a347c1bd9be53513f60ed0e5f440c1f5cd78dec4 Mon Sep 17 00:00:00 2001
+From: "Maciej W. Rozycki" <macro@linux-mips.org>
+Date: Fri, 3 May 2013 15:19:26 +0000
+Subject: [PATCH]         gold/         PR ld/15365         * layout.cc
+ (Layout::finalize): Make __ehdr_start STV_HIDDEN.
+
+        ld/
+        PR ld/15365
+        * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
+        Restrict __ehdr_start's export class to no less than STV_HIDDEN.
+
+        ld/testsuite/
+        PR ld/15365
+        * ld-elf/ehdr_start.d: Expect __ehdr_start to be STB_LOCAL.
+        * ld-mips-elf/ehdr_start-1.nd: New test.
+        * ld-mips-elf/ehdr_start-2.nd: New test.
+        * ld-mips-elf/ehdr_start-1.ld: New test linker script.
+        * ld-mips-elf/ehdr_start-2.ld: New test linker script.
+        * ld-mips-elf/ehdr_start-new.s: New test source.
+        * ld-mips-elf/ehdr_start-o32.s: New test source.
+        * ld-mips-elf/mips-elf.exp: Run the new tests.
+---
+ gold/ChangeLog                            |    5 +++++
+ gold/layout.cc                            |    2 +-
+ ld/ChangeLog                              |    6 ++++++
+ ld/emultempl/elf32.em                     |    7 +++++++
+ ld/testsuite/ChangeLog                    |   12 ++++++++++++
+ ld/testsuite/ld-elf/ehdr_start.d          |    2 +-
+ ld/testsuite/ld-mips-elf/ehdr_start-1.ld  |    9 +++++++++
+ ld/testsuite/ld-mips-elf/ehdr_start-1.nd  |    4 ++++
+ ld/testsuite/ld-mips-elf/ehdr_start-2.ld  |   10 ++++++++++
+ ld/testsuite/ld-mips-elf/ehdr_start-2.nd  |    4 ++++
+ ld/testsuite/ld-mips-elf/ehdr_start-new.s |   13 +++++++++++++
+ ld/testsuite/ld-mips-elf/ehdr_start-o32.s |   14 ++++++++++++++
+ ld/testsuite/ld-mips-elf/mips-elf.exp     |   25 +++++++++++++++++++++++++
+ 13 files changed, 111 insertions(+), 2 deletions(-)
+ create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-1.ld
+ create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-1.nd
+ create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-2.ld
+ create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-2.nd
+ create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-new.s
+ create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-o32.s
+
+Upstream-Status: Backport
+Index: binutils-2.23.2/gold/layout.cc
+===================================================================
+--- binutils-2.23.2.orig/gold/layout.cc        2013-06-26 23:29:32.000000000 -0700
++++ binutils-2.23.2/gold/layout.cc     2013-06-26 23:39:22.170432315 -0700
+@@ -2516,7 +2516,7 @@
+     symtab->define_in_output_segment("__ehdr_start", NULL,
+                                    Symbol_table::PREDEFINED, load_seg, 0, 0,
+                                    elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
+-                                   elfcpp::STV_DEFAULT, 0,
++                                   elfcpp::STV_HIDDEN, 0,
+                                    Symbol::SEGMENT_START, true);
+   // Set the file offsets of all the non-data sections we've seen so
+Index: binutils-2.23.2/ld/emultempl/elf32.em
+===================================================================
+--- binutils-2.23.2.orig/ld/emultempl/elf32.em 2013-06-26 23:37:04.000000000 -0700
++++ binutils-2.23.2/ld/emultempl/elf32.em      2013-06-26 23:39:22.174432315 -0700
+@@ -1498,6 +1498,13 @@
+     {
+       _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
++      /* Make __ehdr_start hidden if it has been referenced, to
++       prevent the symbol from being dynamic.  */
++      if (!bfd_elf_record_link_assignment (link_info.output_bfd, &link_info,
++                                         "__ehdr_start", TRUE, TRUE))
++      einfo ("%P%F: failed to record assignment to %s: %E\n",
++             "__ehdr_start");
++
+       /* If we are going to make any variable assignments, we need to
+        let the ELF backend know about them in case the variables are
+        referred to by dynamic objects.  */
+Index: binutils-2.23.2/ld/testsuite/ld-elf/ehdr_start.d
+===================================================================
+--- binutils-2.23.2.orig/ld/testsuite/ld-elf/ehdr_start.d      2013-06-26 23:29:32.000000000 -0700
++++ binutils-2.23.2/ld/testsuite/ld-elf/ehdr_start.d   2013-06-26 23:39:22.174432315 -0700
+@@ -4,5 +4,5 @@
+ #target: *-*-linux* *-*-gnu* *-*-nacl*
+ #...
+-[0-9a-f]*000 [ADRT] __ehdr_start
++[0-9a-f]*000 [Adrt] __ehdr_start
+ #pass
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.ld
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.ld   2013-06-26 23:39:22.174432315 -0700
+@@ -0,0 +1,9 @@
++ENTRY (__start)
++SECTIONS
++{
++  . = 0x12300000 + SIZEOF_HEADERS;
++  .text : { *(.text) }
++  . = 0x23400000;
++  HIDDEN (_gp = ALIGN (16) + 0x7ff0);
++  .got : { *(.got) }
++}
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.nd
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.nd   2013-06-26 23:39:22.174432315 -0700
+@@ -0,0 +1,4 @@
++Symbol table '\.symtab' contains [0-9]+ entries:
++#...
++ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start
++#pass
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.ld
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.ld   2013-06-26 23:39:22.174432315 -0700
+@@ -0,0 +1,10 @@
++ENTRY (__start)
++SECTIONS
++{
++  . = 0x12300000 + SIZEOF_HEADERS;
++  .text : { *(.text) }
++  . = 0x23400000;
++  __ehdr_start = .;
++  HIDDEN (_gp = ALIGN (16) + 0x7ff0);
++  .got : { *(.got) }
++}
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.nd
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.nd   2013-06-26 23:39:22.178432315 -0700
+@@ -0,0 +1,4 @@
++Symbol table '\.symtab' contains [0-9]+ entries:
++#...
++ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start
++#pass
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-new.s
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-new.s  2013-06-26 23:39:22.178432315 -0700
+@@ -0,0 +1,13 @@
++      .abicalls
++      .text
++      .weak   __ehdr_start
++      .globl  __start
++      .ent    __start
++      .frame  $29, 0, $31
++      .mask   0x00000000, 0
++__start:
++      .cplocal $2
++      .cpsetup $t9, $zero, __start
++      lw      $2, __ehdr_start
++      jr      $31
++      .end    __start
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-o32.s
+===================================================================
+--- /dev/null  1970-01-01 00:00:00.000000000 +0000
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-o32.s  2013-06-26 23:39:22.178432315 -0700
+@@ -0,0 +1,14 @@
++      .abicalls
++      .text
++      .weak   __ehdr_start
++      .globl  __start
++      .ent    __start
++      .frame  $29, 0, $31
++      .mask   0x00000000, 0
++__start:
++      .set    noreorder
++      .cpload $25
++      .set    reorder
++      lw      $2, __ehdr_start
++      jr      $31
++      .end    __start
+Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/mips-elf.exp
+===================================================================
+--- binutils-2.23.2.orig/ld/testsuite/ld-mips-elf/mips-elf.exp 2013-06-26 23:29:32.000000000 -0700
++++ binutils-2.23.2/ld/testsuite/ld-mips-elf/mips-elf.exp      2013-06-26 23:39:22.178432315 -0700
+@@ -669,3 +669,28 @@
+               "readelf -A export-class-call16-${abi}.gd"] \
+           "export-class-call16-${abi}.so"]]
+ }
++
++# Magic __ehdr_start symbol tests.
++set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]]
++foreach { abi } $abis {
++    set suff [string map {o32 o32 n32 new n64 new} $abi]
++    run_ld_link_tests [list \
++        [list \
++            "MIPS magic __ehdr_start symbol test 1 ($abi)" \
++            "$abi_ldflags($abi) -T ehdr_start-1.ld" "" \
++            "$abi_asflags($abi)" \
++            [list ehdr_start-${suff}.s] \
++            [list "readelf -s ehdr_start-1.nd"] \
++            "ehdr_start-1-${abi}"]]
++    if [regexp "(?:n32|n64)" "$abi"] {
++      setup_kfail "mips*-*-*" "ld/15428"
++    }
++    run_ld_link_tests [list \
++        [list \
++            "MIPS magic __ehdr_start symbol test 2 ($abi)" \
++            "$abi_ldflags($abi) -T ehdr_start-2.ld" "" \
++            "$abi_asflags($abi)" \
++            [list ehdr_start-${suff}.s] \
++            [list "readelf -s ehdr_start-2.nd"] \
++            "ehdr_start-2-${abi}"]]
++}