* [binutils-gdb] pe.em and pep.em make_import_fixup
@ 2023-05-08 4:35 Alan Modra
0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2023-05-08 4:35 UTC (permalink / raw)
To: bfd-cvs
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f35cc0decdd7595b34daa30803038342864b7888
commit f35cc0decdd7595b34daa30803038342864b7888
Author: Alan Modra <amodra@gmail.com>
Date: Mon May 8 09:16:24 2023 +0930
pe.em and pep.em make_import_fixup
This is a little cleanup that I made when looking at pr30343 that
makes it more obvious that make_import_fixup in both files are
identical (and in fact the new pep.em read_addend could be used in
both files).
* emultempl/pep.em (read_addend): Extract from..
(make_import_fixup): ..here.
* emultempl/pe.em (read_addend): Similarly.
(make_import_fixup): Similarly. Add debug code from pep.em.
Diff:
---
ld/emultempl/pe.em | 33 ++++++++++++++++-----
ld/emultempl/pep.em | 83 ++++++++++++++++++++++++++++++++---------------------
2 files changed, 76 insertions(+), 40 deletions(-)
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 4fe0cf203fb..38cb61138bd 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -1236,23 +1236,42 @@ pe_fixup_stdcalls (void)
}
}
+static bfd_vma
+read_addend (arelent *rel, asection *s)
+{
+ char buf[4];
+ bfd_vma addend = 0;
+
+ if (!bfd_get_section_contents (s->owner, s, buf, rel->address, sizeof (buf)))
+ einfo (_("%P: %C: cannot get section contents - auto-import exception\n"),
+ s->owner, s, rel->address);
+ else
+ addend = bfd_get_32 (s->owner, buf);
+ return addend;
+}
+
static void
make_import_fixup (arelent *rel, asection *s, char *name, const char *symname)
{
struct bfd_symbol *sym = *rel->sym_ptr_ptr;
- char addend[4];
- bfd_vma _addend;
+ bfd_vma addend;
if (pe_dll_extra_pe_debug)
printf ("arelent: %s@%#lx: add=%li\n", sym->name,
(unsigned long) rel->address, (long) rel->addend);
- if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend)))
- einfo (_("%P: %C: cannot get section contents - auto-import exception\n"),
- s->owner, s, rel->address);
+ addend = read_addend (rel, s);
+
+ if (pe_dll_extra_pe_debug)
+ {
+ printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx",
+ (long) addend, (long) rel->addend, (long) rel->address);
+ if (rel->howto->pc_relative)
+ printf (" pcrel");
+ printf (" %d bit rel.\n", (int) rel->howto->bitsize);
+ }
- _addend = bfd_get_32 (s->owner, addend);
- pe_create_import_fixup (rel, s, _addend, name, symname);
+ pe_create_import_fixup (rel, s, addend, name, symname);
}
static void
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index 5770df8ed0a..32883b27706 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -1197,63 +1197,80 @@ pep_fixup_stdcalls (void)
}
}
-static void
-make_import_fixup (arelent *rel, asection *s, char *name, const char *symname)
+static bfd_vma
+read_addend (arelent *rel, asection *s)
{
- struct bfd_symbol *sym = *rel->sym_ptr_ptr;
- char addend[8];
- bfd_vma _addend = 0;
- int suc = 0;
+ char buf[8];
+ bfd_vma addend = 0;
+ bool ok = false;
- if (pep_dll_extra_pe_debug)
- printf ("arelent: %s@%#lx: add=%li\n", sym->name,
- (unsigned long) rel->address, (long) rel->addend);
-
- memset (addend, 0, sizeof (addend));
- switch ((rel->howto->bitsize))
+ switch (rel->howto->bitsize)
{
case 8:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1);
- if (suc && rel->howto->pc_relative)
- _addend = bfd_get_signed_8 (s->owner, addend);
- else if (suc)
- _addend = bfd_get_8 (s->owner, addend);
+ ok = bfd_get_section_contents (s->owner, s, buf, rel->address, 1);
+ if (ok)
+ {
+ if (rel->howto->pc_relative)
+ addend = bfd_get_signed_8 (s->owner, buf);
+ else
+ addend = bfd_get_8 (s->owner, buf);
+ }
break;
case 16:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2);
- if (suc && rel->howto->pc_relative)
- _addend = bfd_get_signed_16 (s->owner, addend);
- else if (suc)
- _addend = bfd_get_16 (s->owner, addend);
+ ok = bfd_get_section_contents (s->owner, s, buf, rel->address, 2);
+ if (ok)
+ {
+ if (rel->howto->pc_relative)
+ addend = bfd_get_signed_16 (s->owner, buf);
+ else
+ addend = bfd_get_16 (s->owner, buf);
+ }
break;
case 26:
case 32:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4);
- if (suc && rel->howto->pc_relative)
- _addend = bfd_get_signed_32 (s->owner, addend);
- else if (suc)
- _addend = bfd_get_32 (s->owner, addend);
+ ok = bfd_get_section_contents (s->owner, s, buf, rel->address, 4);
+ if (ok)
+ {
+ if (rel->howto->pc_relative)
+ addend = bfd_get_signed_32 (s->owner, buf);
+ else
+ addend = bfd_get_32 (s->owner, buf);
+ }
break;
case 64:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8);
- if (suc)
- _addend = bfd_get_64 (s->owner, addend);
+ ok = bfd_get_section_contents (s->owner, s, buf, rel->address, 8);
+ if (ok)
+ addend = bfd_get_64 (s->owner, buf);
break;
}
- if (! suc)
+ if (!ok)
einfo (_("%P: %C: cannot get section contents - auto-import exception\n"),
s->owner, s, rel->address);
+ return addend;
+}
+
+static void
+make_import_fixup (arelent *rel, asection *s, char *name, const char *symname)
+{
+ struct bfd_symbol *sym = *rel->sym_ptr_ptr;
+ bfd_vma addend;
+
+ if (pep_dll_extra_pe_debug)
+ printf ("arelent: %s@%#lx: add=%li\n", sym->name,
+ (unsigned long) rel->address, (long) rel->addend);
+
+ addend = read_addend (rel, s);
if (pep_dll_extra_pe_debug)
{
printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx",
- (long) _addend, (long) rel->addend, (long) rel->address);
+ (long) addend, (long) rel->addend, (long) rel->address);
if (rel->howto->pc_relative)
printf (" pcrel");
printf (" %d bit rel.\n", (int) rel->howto->bitsize);
}
- pep_create_import_fixup (rel, s, _addend, name, symname);
+ pep_create_import_fixup (rel, s, addend, name, symname);
}
static void
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-05-08 4:35 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-08 4:35 [binutils-gdb] pe.em and pep.em make_import_fixup Alan Modra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).