+2011-10-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13250
+ * elflink.c (elf_link_add_object_symbols): Preserve the maximum
+ alignment and size for common symbols.
+
2011-10-08 Alan Modra <amodra@gmail.com>
PR ld/13229
{
struct bfd_hash_entry *p;
struct elf_link_hash_entry *h;
+ bfd_size_type size;
+ unsigned int alignment_power;
for (p = htab->root.table.table[i]; p != NULL; p = p->next)
{
if (h->dynindx >= old_dynsymcount)
_bfd_elf_strtab_delref (htab->dynstr, h->dynstr_index);
+ /* Preserve the maximum alignment and size for common
+ symbols even if this dynamic lib isn't on DT_NEEDED
+ since it can still be loaded at the run-time by another
+ dynamic lib. */
+ if (h->root.type == bfd_link_hash_common)
+ {
+ size = h->root.u.c.size;
+ alignment_power = h->root.u.c.p->alignment_power;
+ }
+ else
+ {
+ size = 0;
+ alignment_power = 0;
+ }
memcpy (p, old_ent, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
h = (struct elf_link_hash_entry *) p;
memcpy (h->root.u.i.link, old_ent, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
}
+ else if (h->root.type == bfd_link_hash_common)
+ {
+ if (size > h->root.u.c.size)
+ h->root.u.c.size = size;
+ if (alignment_power > h->root.u.c.p->alignment_power)
+ h->root.u.c.p->alignment_power = alignment_power;
+ }
}
}
+2011-10-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13250
+ * ld-elf/shared.exp (build_tests): Add tests for PR ld/13250.
+ (run_tests): Likewise.
+
+ * ld-elf/pr13250-1.c: New.
+ * ld-elf/pr13250-2.c: Likewise.
+ * ld-elf/pr13250-3.c: Likewise.
+
2011-10-07 H.J. Lu <hongjiu.lu@intel.com>
* ld-elf/elf.exp: Run --gc-sections tests only if --gc-sections
--- /dev/null
+int common1[8];
+void
+foo ()
+{
+ int i;
+ for (i = 0; i < sizeof (common1)/ sizeof (common1[0]); i++)
+ common1[i] = -1;
+}
--- /dev/null
+extern int common1[8];
+
+extern void foo ();
+
+int
+bar ()
+{
+ foo ();
+ return common1[4];
+}
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+int common1[1];
+char common2[2];
+
+extern int bar ();
+
+int
+main ()
+{
+ int i;
+ if (bar () != -1)
+ abort ();
+ if (common1[0] != -1)
+ abort ();
+ for (i = 0; i < sizeof (common2)/ sizeof (common2[0]); i++)
+ if (common2[i] != 0)
+ abort ();
+ printf ("PASS\n");
+ return 0;
+}
{"Build libpr11138-2.o"
"-r -nostdlib" ""
{pr11138-2.c} {} "libpr11138-2.o"}
+ {"Build pr13250-1.so"
+ "-shared" "-fPIC"
+ {pr13250-1.c} {} "libpr13250-1.so"}
+ {"Build pr13250-2.so with libpr13250-1.so"
+ "-shared tmpdir/libpr13250-1.so" "-fPIC"
+ {pr13250-2.c} {} "libpr13250-2.so"}
+ {"Build libpr13250-3.o"
+ "-r -nostdlib" ""
+ {pr13250-3.c} {} "libpr13250-3.o"}
}
run_cc_link_tests $build_tests
{"Run with libpr11138-1.so pr11138-2.c"
"--version-script=pr11138-2.map tmpdir/libpr11138-1.so tmpdir/pr11138-2.o" ""
{dummy.c} "pr11138b" "pr11138.out"}
+ {"Run with pr13250-3.c, libpr13250-1.so and libpr13250-2.so"
+ "--as-needed tmpdir/pr13250-3.o tmpdir/libpr13250-1.so tmpdir/libpr13250-2.so" ""
+ {dummy.c} "pr13250" "pass.out"}
}
# NetBSD ELF systems do not currently support the .*_array sections.