diff options
Diffstat (limited to 'meta-xilinx-bsp/recipes-microblaze/binutils/binutils-2.31/0027-Patch-Microblaze-PR22471-undefined-reference-to-link.patch')
-rw-r--r-- | meta-xilinx-bsp/recipes-microblaze/binutils/binutils-2.31/0027-Patch-Microblaze-PR22471-undefined-reference-to-link.patch | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/meta-xilinx-bsp/recipes-microblaze/binutils/binutils-2.31/0027-Patch-Microblaze-PR22471-undefined-reference-to-link.patch b/meta-xilinx-bsp/recipes-microblaze/binutils/binutils-2.31/0027-Patch-Microblaze-PR22471-undefined-reference-to-link.patch new file mode 100644 index 00000000..002b3794 --- /dev/null +++ b/meta-xilinx-bsp/recipes-microblaze/binutils/binutils-2.31/0027-Patch-Microblaze-PR22471-undefined-reference-to-link.patch @@ -0,0 +1,363 @@ +From 059fc6d823a81602d951275ba99430550b84f8a3 Mon Sep 17 00:00:00 2001 +From: Mahesh Bodapati <mbodapat@xilinx.com> +Date: Tue, 26 Feb 2019 17:46:36 +0530 +Subject: [PATCH 27/31] [Patch,Microblaze] : "PR22471, undefined reference to + linker-defined symbols" is causing runtime loops.reverting for now. + +Signed-off-by: Mahesh Bodapati <mbodapat@xilinx.com> +Signed-off-by: Nagaraju Mekala <nagaraju.mekala@xilinx.com> +--- + bfd/elflink.c | 7 +--- + bfd/linker.c | 9 +---- + ld/ldexp.c | 64 +++++++++++++++++++------------ + ld/ldlang.c | 6 +-- + ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d | 4 +- + ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got | 2 +- + ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d | 4 +- + ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got | 2 +- + ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d | 4 +- + ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got | 2 +- + 10 files changed, 53 insertions(+), 51 deletions(-) + +diff --git a/bfd/elflink.c b/bfd/elflink.c +index b316149..3860891 100644 +--- a/bfd/elflink.c ++++ b/bfd/elflink.c +@@ -1496,15 +1496,10 @@ _bfd_elf_merge_symbol (bfd *abfd, + treated as strong if the new symbol is from a dynamic library. + This reflects the way glibc's ld.so works. + +- Also allow a weak symbol to override a linker script symbol +- defined by an early pass over the script. This is done so the +- linker knows the symbol is defined in an object file, for the +- DEFINED script function. +- + Do this before setting *type_change_ok or *size_change_ok so that + we warn properly when dynamic library symbols are overridden. */ + +- if (newdef && !newdyn && (olddyn || h->root.ldscript_def)) ++ if (newdef && !newdyn && olddyn) + newweak = FALSE; + if (olddef && newdyn) + oldweak = FALSE; +diff --git a/bfd/linker.c b/bfd/linker.c +index 6b4c8e5..8d51c2a 100644 +--- a/bfd/linker.c ++++ b/bfd/linker.c +@@ -1449,14 +1449,9 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, + do + { + enum link_action action; +- int prev; + +- prev = h->type; +- /* Treat symbols defined by early linker script pass as undefined. */ +- if (h->ldscript_def) +- prev = bfd_link_hash_undefined; + cycle = FALSE; +- action = link_action[(int) row][prev]; ++ action = link_action[(int) row][(int) h->type]; + switch (action) + { + case FAIL: +@@ -1500,7 +1495,6 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, + h->u.def.section = section; + h->u.def.value = value; + h->linker_def = 0; +- h->ldscript_def = 0; + + /* If we have been asked to, we act like collect2 and + identify all functions that might be global +@@ -1600,7 +1594,6 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, + else + h->u.c.p->section = section; + h->linker_def = 0; +- h->ldscript_def = 0; + break; + + case REF: +diff --git a/ld/ldexp.c b/ld/ldexp.c +index 6fa251e..d46a06f 100644 +--- a/ld/ldexp.c ++++ b/ld/ldexp.c +@@ -60,12 +60,15 @@ struct definedness_hash_entry + section statement, the section we'd like it relative to. */ + asection *final_sec; + +- /* Low bits of iteration count. Symbols with matching iteration have +- been defined in this pass over the script. */ +- unsigned int iteration : 8; +- + /* Symbol was defined by an object file. */ + unsigned int by_object : 1; ++ ++ /* Symbols was defined by a script. */ ++ unsigned int by_script : 1; ++ ++ /* Low bit of iteration count. Symbols with matching iteration have ++ been defined in this pass over the script. */ ++ unsigned int iteration : 1; + }; + + static struct bfd_hash_table definedness_table; +@@ -283,6 +286,7 @@ definedness_newfunc (struct bfd_hash_entry *entry, + einfo (_("%F%P: bfd_hash_allocate failed creating symbol %s\n"), name); + + ret->by_object = 0; ++ ret->by_script = 0; + ret->iteration = 0; + return &ret->root; + } +@@ -316,7 +320,7 @@ update_definedness (const char *name, struct bfd_link_hash_entry *h) + /* If the symbol was already defined, and not by a script, then it + must be defined by an object file or by the linker target code. */ + ret = TRUE; +- if (!h->ldscript_def ++ if (!defentry->by_script + && (h->type == bfd_link_hash_defined + || h->type == bfd_link_hash_defweak + || h->type == bfd_link_hash_common)) +@@ -328,6 +332,7 @@ update_definedness (const char *name, struct bfd_link_hash_entry *h) + ret = FALSE; + } + ++ defentry->by_script = 1; + defentry->iteration = lang_statement_iteration; + defentry->final_sec = bfd_abs_section_ptr; + if (expld.phase == lang_final_phase_enum +@@ -681,9 +686,6 @@ fold_trinary (etree_type *tree) + static void + fold_name (etree_type *tree) + { +- struct bfd_link_hash_entry *h; +- struct definedness_hash_entry *def; +- + memset (&expld.result, 0, sizeof (expld.result)); + + switch (tree->type.node_code) +@@ -701,18 +703,23 @@ fold_name (etree_type *tree) + break; + + case DEFINED: +- h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, +- &link_info, +- tree->name.name, +- FALSE, FALSE, TRUE); +- new_number (h != NULL +- && (h->type == bfd_link_hash_defined +- || h->type == bfd_link_hash_defweak +- || h->type == bfd_link_hash_common) +- && (!h->ldscript_def +- || (def = symbol_defined (tree->name.name)) == NULL +- || def->by_object +- || def->iteration == (lang_statement_iteration & 255))); ++ if (expld.phase != lang_first_phase_enum) ++ { ++ struct bfd_link_hash_entry *h; ++ struct definedness_hash_entry *def; ++ ++ h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, ++ &link_info, ++ tree->name.name, ++ FALSE, FALSE, TRUE); ++ new_number (h != NULL ++ && (h->type == bfd_link_hash_defined ++ || h->type == bfd_link_hash_defweak ++ || h->type == bfd_link_hash_common) ++ && ((def = symbol_defined (tree->name.name)) == NULL ++ || def->by_object ++ || def->iteration == (lang_statement_iteration & 1))); ++ } + break; + + case NAME: +@@ -721,6 +728,9 @@ fold_name (etree_type *tree) + { + /* Self-assignment is only allowed for absolute symbols + defined in a linker script. */ ++ struct bfd_link_hash_entry *h; ++ struct definedness_hash_entry *def; ++ + h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, + &link_info, + tree->name.name, +@@ -730,13 +740,17 @@ fold_name (etree_type *tree) + || h->type == bfd_link_hash_defweak) + && h->u.def.section == bfd_abs_section_ptr + && (def = symbol_defined (tree->name.name)) != NULL +- && def->iteration == (lang_statement_iteration & 255))) ++ && def->iteration == (lang_statement_iteration & 1))) + expld.assign_name = NULL; + } +- if (tree->name.name[0] == '.' && tree->name.name[1] == 0) ++ if (expld.phase == lang_first_phase_enum) ++ ; ++ else if (tree->name.name[0] == '.' && tree->name.name[1] == 0) + new_rel_from_abs (expld.dot); + else + { ++ struct bfd_link_hash_entry *h; ++ + h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, + &link_info, + tree->name.name, +@@ -751,7 +765,7 @@ fold_name (etree_type *tree) + output_section = h->u.def.section->output_section; + if (output_section == NULL) + { +- if (expld.phase <= lang_mark_phase_enum) ++ if (expld.phase == lang_mark_phase_enum) + new_rel (h->u.def.value, h->u.def.section); + else + einfo (_("%X%P:%pS: unresolvable symbol `%s'" +@@ -943,12 +957,12 @@ is_sym_value (const etree_type *tree, bfd_vma val) + return (tree->type.node_class == etree_name + && tree->type.node_code == NAME + && (def = symbol_defined (tree->name.name)) != NULL +- && def->iteration == (lang_statement_iteration & 255) ++ && def->by_script ++ && def->iteration == (lang_statement_iteration & 1) + && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, + &link_info, + tree->name.name, + FALSE, FALSE, TRUE)) != NULL +- && h->ldscript_def + && h->type == bfd_link_hash_defined + && h->u.def.section == bfd_abs_section_ptr + && h->u.def.value == val); +diff --git a/ld/ldlang.c b/ld/ldlang.c +index 350baf2..7e12480 100644 +--- a/ld/ldlang.c ++++ b/ld/ldlang.c +@@ -3360,7 +3360,9 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode) + #endif + break; + case lang_assignment_statement_enum: +- if (s->assignment_statement.exp->type.node_class != etree_assert) ++ if (s->assignment_statement.exp->type.node_class != etree_assert ++ && s->assignment_statement.exp->assign.defsym) ++ /* This is from a --defsym on the command line. */ + exp_fold_tree_no_dot (s->assignment_statement.exp); + break; + default: +@@ -7176,7 +7178,6 @@ lang_process (void) + + /* Create a bfd for each input file. */ + current_target = default_target; +- lang_statement_iteration++; + open_input_bfds (statement_list.head, OPEN_BFD_NORMAL); + + #ifdef ENABLE_PLUGINS +@@ -7232,7 +7233,6 @@ lang_process (void) + + /* Rescan archives in case new undefined symbols have appeared. */ + files = file_chain; +- lang_statement_iteration++; + open_input_bfds (statement_list.head, OPEN_BFD_RESCAN); + lang_list_remove_tail (&file_chain, &files); + while (files.head != NULL) +diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d +index 17e42d0..011df6c 100644 +--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d ++++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.d +@@ -5,7 +5,7 @@ Disassembly of section .text: + + .* <__start>: + .*: 3c1c0fc0 lui gp,0xfc0 +- .*: 279c7b80 addiu gp,gp,31616 ++ .*: 279c7c30 addiu gp,gp,31792 + .*: 0399e021 addu gp,gp,t9 + .*: 27bdfff0 addiu sp,sp,-16 + .*: afbe0008 sw s8,8\(sp\) +@@ -55,7 +55,7 @@ Disassembly of section .text: + + .* <other>: + .*: 3c1c0fc0 lui gp,0xfc0 +- .*: 279c7ac0 addiu gp,gp,31424 ++ .*: 279c7b70 addiu gp,gp,31600 + .*: 0399e021 addu gp,gp,t9 + .*: 27bdfff0 addiu sp,sp,-16 + .*: afbe0008 sw s8,8\(sp\) +diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got b/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got +index 508fed2..1dbcab4 100644 +--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got ++++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-1.got +@@ -13,6 +13,6 @@ OFFSET TYPE VALUE + + + Contents of section .got: +- 10000020 00000000 80000000 0040053c 00000000 .........@...... ++ 10000020 00000000 80000000 0040048c 00000000 .........@...... + 10000030 00000000 00000000 00000000 00000000 ................ + 10000040 00000000 00000001 00000000 ............ +diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d +index 17e42d0..011df6c 100644 +--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d ++++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.d +@@ -5,7 +5,7 @@ Disassembly of section .text: + + .* <__start>: + .*: 3c1c0fc0 lui gp,0xfc0 +- .*: 279c7b80 addiu gp,gp,31616 ++ .*: 279c7c30 addiu gp,gp,31792 + .*: 0399e021 addu gp,gp,t9 + .*: 27bdfff0 addiu sp,sp,-16 + .*: afbe0008 sw s8,8\(sp\) +@@ -55,7 +55,7 @@ Disassembly of section .text: + + .* <other>: + .*: 3c1c0fc0 lui gp,0xfc0 +- .*: 279c7ac0 addiu gp,gp,31424 ++ .*: 279c7b70 addiu gp,gp,31600 + .*: 0399e021 addu gp,gp,t9 + .*: 27bdfff0 addiu sp,sp,-16 + .*: afbe0008 sw s8,8\(sp\) +diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got b/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got +index 4a97099..fb50635 100644 +--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got ++++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-2.got +@@ -13,6 +13,6 @@ OFFSET TYPE VALUE + + + Contents of section .got: +- 10000020 00000000 80000000 0040053c 00000000 .* ++ 10000020 00000000 80000000 0040048c 00000000 .* + 10000030 00000000 00000000 00000000 00000000 .* + 10000040 00000000 00000001 00000000 .* +diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d b/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d +index fb3750a..3828aca 100644 +--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d ++++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.d +@@ -5,7 +5,7 @@ Disassembly of section .text: + + .* <other>: + .*: 3c1c0fc0 lui gp,0xfc0 +- .*: 279c7b80 addiu gp,gp,31616 ++ .*: 279c7c30 addiu gp,gp,31792 + .*: 0399e021 addu gp,gp,t9 + .*: 27bdfff0 addiu sp,sp,-16 + .*: afbe0008 sw s8,8\(sp\) +@@ -51,7 +51,7 @@ Disassembly of section .text: + + .* <__start>: + .*: 3c1c0fc0 lui gp,0xfc0 +- .*: 279c7ad0 addiu gp,gp,31440 ++ .*: 279c7b80 addiu gp,gp,31616 + .*: 0399e021 addu gp,gp,t9 + .*: 27bdfff0 addiu sp,sp,-16 + .*: afbe0008 sw s8,8\(sp\) +diff --git a/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got b/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got +index d96375c..4a97099 100644 +--- a/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got ++++ b/ld/testsuite/ld-mips-elf/tlsdyn-o32-3.got +@@ -13,6 +13,6 @@ OFFSET TYPE VALUE + + + Contents of section .got: +- 10000020 00000000 80000000 004005ec 00000000 .* ++ 10000020 00000000 80000000 0040053c 00000000 .* + 10000030 00000000 00000000 00000000 00000000 .* + 10000040 00000000 00000001 00000000 .* +-- +2.7.4 + |