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;
}
{
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;
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;
}
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 *));
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;
}
}
}
+ /* Just in case there is no trailing SO entry. */
if (oso_file != NULL)
macho_add_oso (oso_file, nbr_sections, first_symbol, first_offset);
}