aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2012-01-04 10:14:25 +0000
committerTristan Gingold <gingold@adacore.com>2012-01-04 10:14:25 +0000
commitaeefa1c9a50aac0036d605517255ef6d111d56f8 (patch)
tree59b54a6c5a639fd4d26ca5a5fd1de5c496096bed /bfd
parentfc55a902573b7f73d8f138b843f31f5adbe7331e (diff)
downloadbinutils-aeefa1c9a50aac0036d605517255ef6d111d56f8.zip
binutils-aeefa1c9a50aac0036d605517255ef6d111d56f8.tar.gz
binutils-aeefa1c9a50aac0036d605517255ef6d111d56f8.tar.bz2
bfd/
2012-01-04 Tristan Gingold <gingold@adacore.com> * mach-o.c (bfd_mach_o_get_synthetic_symtab): Add comments.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/mach-o.c9
2 files changed, 12 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e3d2a48..4e440eb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,9 @@
2012-01-04 Tristan Gingold <gingold@adacore.com>
+ * mach-o.c (bfd_mach_o_get_synthetic_symtab): Add comments.
+
+2012-01-04 Tristan Gingold <gingold@adacore.com>
+
* mach-o.h: Reindent header.
(bfd_mach_o_encryption_info_command): New structure.
(bfd_mach_o_load_command): Add encryption_info field.
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index 57c37d8..ddc8944 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -651,6 +651,8 @@ bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
return nsyms;
}
+/* Create synthetic symbols for indirect symbols. */
+
long
bfd_mach_o_get_synthetic_symtab (bfd *abfd,
long symcount ATTRIBUTE_UNUSED,
@@ -670,19 +672,23 @@ bfd_mach_o_get_synthetic_symtab (bfd *abfd,
*ret = NULL;
+ /* Stop now if no symbols or no indirect symbols. */
if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
return 0;
if (dysymtab->nindirectsyms == 0)
return 0;
+ /* We need to allocate a bfd symbol for every indirect symbol and to
+ allocate the memory for its name. */
count = dysymtab->nindirectsyms;
size = count * sizeof (asymbol) + 1;
for (j = 0; j < count; j++)
{
unsigned int isym = dysymtab->indirect_syms[j];
-
+
+ /* Some indirect symbols are anonymous. */
if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
}
@@ -707,6 +713,7 @@ bfd_mach_o_get_synthetic_symtab (bfd *abfd,
case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
case BFD_MACH_O_S_SYMBOL_STUBS:
+ /* Only these sections have indirect symbols. */
first = sec->reserved1;
last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
addr = sec->addr;