aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2002-12-04 23:56:14 +0000
committerAlan Modra <amodra@gmail.com>2002-12-04 23:56:14 +0000
commit36478e9d6fdfc553b21fa060bf791c5e900db693 (patch)
treef0f0093450f74add445294f8086454b9eb0cebb4 /ld
parent9b7400f84d2d8ec984c23ef9546a5e037eed4259 (diff)
downloadgdb-36478e9d6fdfc553b21fa060bf791c5e900db693.zip
gdb-36478e9d6fdfc553b21fa060bf791c5e900db693.tar.gz
gdb-36478e9d6fdfc553b21fa060bf791c5e900db693.tar.bz2
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Set
load_base for orphans that follow a section with load_base set.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/emultempl/elf32.em16
2 files changed, 18 insertions, 3 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 37f1412..09b9c7d 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2002-12-05 Alan Modra <amodra@bigpond.net.au>
+
+ * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Set
+ load_base for orphans that follow a section with load_base set.
+
2002-12-01 H.J. Lu <hjl@gnu.org>
* ld.texinfo: Remove the extra `;' in sample version script.
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 60a789e..06fdd81 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1093,6 +1093,7 @@ gld${EMULATION_NAME}_place_orphan (file, s)
const char *secname;
const char *ps = NULL;
lang_output_section_statement_type *os;
+ etree_type *load_base;
int isdyn = 0;
secname = bfd_get_section_name (s->owner, s);
@@ -1227,16 +1228,25 @@ gld${EMULATION_NAME}_place_orphan (file, s)
}
}
+ address = NULL;
if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
address = exp_intop ((bfd_vma) 0);
- else
- address = NULL;
+
+ load_base = NULL;
+ if (place != NULL && place->os->load_base != NULL)
+ {
+ etree_type *lma_from_vma;
+ lma_from_vma = exp_binop ('-', place->os->load_base,
+ exp_nameop (ADDR, place->os->name));
+ load_base = exp_binop ('+', lma_from_vma,
+ exp_nameop (ADDR, secname));
+ }
os = lang_enter_output_section_statement (secname, address, 0,
(bfd_vma) 0,
(etree_type *) NULL,
(etree_type *) NULL,
- (etree_type *) NULL);
+ load_base);
lang_add_section (&os->children, s, os, file);