Don't PROVIDE over top of common symbols

This:
  int end[100000];
  int main(void) { end[99999] = 0; return 0; }
should not segfault.

ld/
	* ldexp.c (exp_fold_tree_1 <etree_provide>): Leave bfd_link_hash_common
	symbols alone.
ld/testsuite/
	* ld-elf/endsym.s, *ld-elf/endsym.d: New test.
This commit is contained in:
Alan Modra 2014-12-22 10:49:23 +10:30
parent cd8e2bcf0d
commit 4cc2bf08a4
5 changed files with 30 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2014-12-23 Alan Modra <amodra@gmail.com>
* ldexp.c (exp_fold_tree_1 <etree_provide>): Leave bfd_link_hash_common
symbols alone.
2014-12-23 Alan Modra <amodra@gmail.com>
* ldexp.c (update_definedness): Correct logic setting by_object.

View File

@ -1070,15 +1070,15 @@ exp_fold_tree_1 (etree_type *tree)
h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst,
FALSE, FALSE, TRUE);
if (h == NULL
|| (h->type != bfd_link_hash_new
&& h->type != bfd_link_hash_undefined
&& h->type != bfd_link_hash_common
&& !(h->type == bfd_link_hash_defined
|| !(h->type == bfd_link_hash_new
|| h->type == bfd_link_hash_undefined
|| (h->type == bfd_link_hash_defined
&& (h->u.def.section->flags
& SEC_LINKER_CREATED) != 0)))
{
/* Do nothing. The symbol was never referenced, or was
defined by some object. */
/* Do nothing. The symbol was never referenced, or
was defined in some object file. Undefined weak
symbols stay undefined. */
break;
}
}

View File

@ -1,3 +1,7 @@
2014-12-23 Alan Modra <amodra@gmail.com>
* ld-elf/endsym.s, *ld-elf/endsym.d: New test.
2014-12-19 Matthew Fortune <matthew.fortune@imgtec.com>
* ld-mips-elf/attr-gnu-4-00.d: Relax check for ISA extension.

View File

@ -0,0 +1,13 @@
#source: start.s
#source: endsym.s
#ld: --sort-common
#nm: -n
#notarget: hppa*-*-hpux*
#...
.* end
#...
.* end2
#...
.* _?_end
#pass

View File

@ -0,0 +1,2 @@
.comm end,4,4
.comm end2,2,2