diff options
author | Tristan Gingold <gingold@adacore.com> | 2009-12-15 09:37:14 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2009-12-15 09:37:14 +0000 |
commit | 3188d986e975577c9dbfabe5ad05e0f873733a66 (patch) | |
tree | 3d90bd6cfe23ed55a8a454f6f61e31b1e7063ecf /gdb/machoread.c | |
parent | 8462aec76da6a09f61f79050cd68c07d9dbc236b (diff) | |
download | gdb-3188d986e975577c9dbfabe5ad05e0f873733a66.zip gdb-3188d986e975577c9dbfabe5ad05e0f873733a66.tar.gz gdb-3188d986e975577c9dbfabe5ad05e0f873733a66.tar.bz2 |
2009-12-15 Tristan Gingold <gingold@adacore.com>
* machoread.c (macho_symtab_read): Add comments. Always set
first_offset.
Diffstat (limited to 'gdb/machoread.c')
-rw-r--r-- | gdb/machoread.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/gdb/machoread.c b/gdb/machoread.c index d7d53bb..e19e4e5 100644 --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -69,7 +69,9 @@ typedef struct oso_el int num_sections; /* Each seaction of the object file is represented by a symbol and its - offset. */ + offset. If the offset is 0, we assume that the symbol is at offset 0 + in the OSO object file and a symbol lookup in the main file is + required to get the offset. */ asymbol **symbols; bfd_vma *offsets; } @@ -124,14 +126,17 @@ macho_symtab_read (struct objfile *objfile, { bfd_vma addr; + /* Debugging symbols are used to collect OSO file names as well + as section offsets. */ + switch (mach_o_sym->n_type) { case N_SO: - if ((sym->name == NULL || sym->name[0] == 0) - && oso_file != NULL) + /* An empty SO entry terminates a chunk for an OSO file. */ + if ((sym->name == NULL || sym->name[0] == 0) && oso_file != NULL) { macho_add_oso (oso_file, nbr_sections, - first_symbol, first_offset); + first_symbol, first_offset); first_symbol = NULL; first_offset = NULL; oso_file = NULL; @@ -149,6 +154,7 @@ macho_symtab_read (struct objfile *objfile, if (addr != 0 && first_symbol[sym->section->index] == NULL) { + /* These STAB entries can directly relocate a section. */ first_symbol[sym->section->index] = sym; first_offset[sym->section->index] = addr + offset; } @@ -156,9 +162,15 @@ macho_symtab_read (struct objfile *objfile, case N_GSYM: gdb_assert (oso_file != NULL); if (first_symbol[sym->section->index] == NULL) - first_symbol[sym->section->index] = sym; + { + /* This STAB entry needs a symbol look-up to relocate + the section. */ + first_symbol[sym->section->index] = sym; + first_offset[sym->section->index] = 0; + } break; case N_OSO: + /* New OSO file. */ gdb_assert (oso_file == NULL); first_symbol = (asymbol **)xmalloc (nbr_sections * sizeof (asymbol *)); @@ -233,6 +245,7 @@ macho_symtab_read (struct objfile *objfile, if (oso_file != NULL && first_symbol[sym->section->index] == NULL) { + /* Standard symbols can directly relocate sections. */ first_symbol[sym->section->index] = sym; first_offset[sym->section->index] = symaddr; } @@ -243,6 +256,7 @@ macho_symtab_read (struct objfile *objfile, } } + /* Just in case there is no trailing SO entry. */ if (oso_file != NULL) macho_add_oso (oso_file, nbr_sections, first_symbol, first_offset); } |