diff --git a/ld/ChangeLog b/ld/ChangeLog index 12d643be02..d4a15a86b3 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2005-06-05 H.J. Lu + + * ldexp.c (exp_mark_used_section): Set SEC_KEEP on current + section only if the symbol will be defined. + 2005-06-04 H.J. Lu PR 992 diff --git a/ld/ldexp.c b/ld/ldexp.c index 7d63c8d9ac..3927f85f0b 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -1247,24 +1247,33 @@ exp_mark_used_section (etree_type *tree, asection *current_section) if (tree->assign.dst[0] != '.' || tree->assign.dst[1] != 0) { etree_value_type result; + bfd_boolean create = tree->type.node_class == etree_assign; + struct bfd_link_hash_entry *h; result = exp_fold_tree_1 (tree->assign.src, current_section, lang_allocating_phase_enum, dot, &dot, TRUE); - if (current_section != bfd_abs_section_ptr) + + /* We mark the current section SEC_KEEP only if the symbol + will be defined. */ + if (!create) + h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, + create, FALSE, TRUE); + else + h = NULL; + + if ((create || h) + && current_section != bfd_abs_section_ptr) current_section->flags |= SEC_KEEP; + if (result.valid_p) { - bfd_boolean create; - struct bfd_link_hash_entry *h; - if (tree->type.node_class == etree_assign) - create = TRUE; - else - create = FALSE; - h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, - create, FALSE, TRUE); + if (create) + h = bfd_link_hash_lookup (link_info.hash, + tree->assign.dst, create, + FALSE, TRUE); if (h == NULL) { if (create) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index a2a946e4b6..52cffd3626 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-06-05 H.J. Lu + + * ld-cris/hiddef1.d: Undo the last change. + * ld-cris/libdso-10.d: Likewise. + * ld-cris/libdso-2.d: Likewise. + 2005-06-04 H.J. Lu * ld-cris/hiddef1.d: Updated. diff --git a/ld/testsuite/ld-cris/hiddef1.d b/ld/testsuite/ld-cris/hiddef1.d index 99d8a3d13d..fd79f920f8 100644 --- a/ld/testsuite/ld-cris/hiddef1.d +++ b/ld/testsuite/ld-cris/hiddef1.d @@ -14,7 +14,7 @@ # and sections change, make sure that there's no .plt and that # dsofn is hidden (not exported as a dynamic symbol). -There are 12 section headers, starting at offset 0x[0-9a-f]+: +There are 11 section headers, starting at offset 0x[0-9a-f]+: #... \[[ 0-9]+\] \.got PROGBITS [0-9a-f]+ [0-9a-f]+ 0+10 04 WA 0 0 4 #... @@ -24,5 +24,5 @@ Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 1 entries: #... Symbol table '\.dynsym' contains 9 entries: #... -Symbol table '\.symtab' contains 20 entries: +Symbol table '\.symtab' contains 19 entries: #pass diff --git a/ld/testsuite/ld-cris/libdso-10.d b/ld/testsuite/ld-cris/libdso-10.d index a0c75c167c..3fe6ddbea9 100644 --- a/ld/testsuite/ld-cris/libdso-10.d +++ b/ld/testsuite/ld-cris/libdso-10.d @@ -35,7 +35,5 @@ Idx Name Size VMA LMA File off Algn CONTENTS, ALLOC, LOAD, DATA 5 \.got 0+c 0+21e0 0+21e0 0+1e0 2\*\*2 CONTENTS, ALLOC, LOAD, DATA - 6 \.data 0+ 0+21ec 0+21ec 0+1ec 2\*\*0 - CONTENTS, ALLOC, LOAD, DATA - 7 \.bss 0+14 0+21ec 0+21ec 0+1ec 2\*\*0 + 6 \.bss 0+14 0+21ec 0+21ec 0+1ec 2\*\*0 ALLOC diff --git a/ld/testsuite/ld-cris/libdso-2.d b/ld/testsuite/ld-cris/libdso-2.d index 48d0fe889f..10bfe28706 100644 --- a/ld/testsuite/ld-cris/libdso-2.d +++ b/ld/testsuite/ld-cris/libdso-2.d @@ -10,7 +10,7 @@ # entries. This formerly SEGV:ed because .rela.got was created # too late to have it mapped to an output section. -There are 15 section headers.* +There are 14 section headers.* #... \[ 1\] \.hash HASH .* \[ 2\] \.dynsym DYNSYM .* @@ -21,11 +21,10 @@ There are 15 section headers.* \[ 7\] \.text PROGBITS .* \[ 8\] \.dynamic DYNAMIC .* \[ 9\] \.got PROGBITS .* - \[10\] \.data PROGBITS .* - \[11\] \.bss NOBITS .* - \[12\] \.shstrtab STRTAB .* - \[13\] \.symtab SYMTAB .* - \[14\] \.strtab STRTAB .* + \[10\] \.bss NOBITS .* + \[11\] \.shstrtab STRTAB .* + \[12\] \.symtab SYMTAB .* + \[13\] \.strtab STRTAB .* #... Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 1 entries: #... @@ -35,12 +34,12 @@ Symbol table '\.dynsym' contains 6 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0+ 0 NOTYPE LOCAL DEFAULT UND 1: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 7 - 2: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 10 - 3: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 11 + 2: [0-9a-f]+ 0 NOTYPE LOCAL DEFAULT UND + 3: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 10 4: 0+ 0 OBJECT GLOBAL DEFAULT ABS TST1 5: 0+188 0 FUNC GLOBAL DEFAULT 7 export_1@@TST1 -Symbol table '\.symtab' contains 23 entries: +Symbol table '\.symtab' contains 22 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0+ 0 NOTYPE LOCAL DEFAULT UND 1: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 1 @@ -56,12 +55,11 @@ Symbol table '\.symtab' contains 23 entries: 11: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 11 12: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 12 13: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 13 - 14: [0-9a-f]+ 0 SECTION LOCAL DEFAULT 14 - 15: 0+2198 0 OBJECT LOCAL DEFAULT ABS _DYNAMIC - 16: 0+2230 0 NOTYPE LOCAL DEFAULT ABS __bss_start - 17: 0+2230 0 NOTYPE LOCAL DEFAULT ABS _edata - 18: 0+2220 0 OBJECT LOCAL HIDDEN ABS _GLOBAL_OFFSET_TABLE_ - 19: 0+2240 0 NOTYPE LOCAL DEFAULT ABS _end - 20: 0+184 0 FUNC LOCAL DEFAULT 7 dsofn - 21: 0+ 0 OBJECT GLOBAL DEFAULT ABS TST1 - 22: 0+188 0 FUNC GLOBAL DEFAULT 7 export_1 + 14: 0+2198 0 OBJECT LOCAL DEFAULT ABS _DYNAMIC + 15: 0+2230 0 NOTYPE LOCAL DEFAULT ABS __bss_start + 16: 0+2230 0 NOTYPE LOCAL DEFAULT ABS _edata + 17: 0+2220 0 OBJECT LOCAL HIDDEN ABS _GLOBAL_OFFSET_TABLE_ + 18: 0+2240 0 NOTYPE LOCAL DEFAULT ABS _end + 19: 0+184 0 FUNC LOCAL DEFAULT 7 dsofn + 20: 0+ 0 OBJECT GLOBAL DEFAULT ABS TST1 + 21: 0+188 0 FUNC GLOBAL DEFAULT 7 export_1