aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/pe-dll.c21
2 files changed, 25 insertions, 1 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e9a3d5b..e45a570 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+Wed Nov 11 18:10:15 1998 DJ Delorie <dj@cygnus.com>
+
+ * pe-dll.c (generate_reloc): don't output PE relocs for sections
+ that won't be loaded.
+
Wed Nov 11 13:44:54 1998 DJ Delorie <dj@cygnus.com>
* pe-dll.c (fill_edata): don't strip underscores
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index aaf1cb1..51520c4 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -617,6 +617,24 @@ generate_reloc (abfd, info)
asymbol **symbols;
int nsyms, symsize;
+ /* if it's not loaded, we don't need to relocate it this way */
+ if (!(s->output_section->flags & SEC_LOAD))
+ continue;
+
+ /* I don't know why there would be a reloc for these, but I've
+ seen it happen - DJ */
+ if (s->output_section == &bfd_abs_section)
+ continue;
+
+ if (s->output_section->vma == 0)
+ {
+ /* Huh? Shouldn't happen, but punt if it does */
+ einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
+ s->output_section->name, s->output_section->index,
+ s->output_section->flags);
+ continue;
+ }
+
symsize = bfd_get_symtab_upper_bound (b);
symbols = (asymbol **) xmalloc (symsize);
nsyms = bfd_canonicalize_symtab (b, symbols);
@@ -627,7 +645,8 @@ generate_reloc (abfd, info)
for (i = 0; i < nrelocs; i++)
{
- if (!relocs[i]->howto->pc_relative)
+ if (!relocs[i]->howto->pc_relative
+ && relocs[i]->howto->type != R_IMAGEBASE)
{
switch (relocs[i]->howto->bitsize)
{