Skip to content
Snippets Groups Projects
Commit f18b4cab authored by Tristan Gingold's avatar Tristan Gingold
Browse files

2010-02-09 Tristan Gingold <gingold@adacore.com>

	* machoread.c (macho_symfile_relocate): New function.
	(macho_sym_fns): Use macho_symfile_relocate instead of
	default_symfile_relocate.
	(macho_oso_data): New type.
	(current_oso): New variable.
	(macho_add_oso_symfile): Do not compute section_addr_info, but
	instead set vma of sections.
	Do not set SYMFILE_VERBOSE to call symbol_file_add_from_bfd.
	Set and clear current_oso.
parent 486499d0
No related branches found
No related tags found
No related merge requests found
2010-02-09 Tristan Gingold <gingold@adacore.com>
* machoread.c (macho_symfile_relocate): New function.
(macho_sym_fns): Use macho_symfile_relocate instead of
default_symfile_relocate.
(macho_oso_data): New type.
(current_oso): New variable.
(macho_add_oso_symfile): Do not compute section_addr_info, but
instead set vma of sections.
Do not set SYMFILE_VERBOSE to call symbol_file_add_from_bfd.
Set and clear current_oso.
2010-02-09 Joel Brobecker <brobecker@adacore.com> 2010-02-09 Joel Brobecker <brobecker@adacore.com>
Wrong type description for tagged type parameter. Wrong type description for tagged type parameter.
......
...@@ -70,6 +70,23 @@ oso_el; ...@@ -70,6 +70,23 @@ oso_el;
DEF_VEC_O (oso_el); DEF_VEC_O (oso_el);
static VEC (oso_el) *oso_vector; static VEC (oso_el) *oso_vector;
struct macho_oso_data
{
/* Per objfile symbol table. This is used to apply relocation to sections
It is loaded only once, then relocated, and free after sections are
relocated. */
asymbol **symbol_table;
/* The offsets for this objfile. Used to relocate the symbol_table. */
struct oso_el *oso;
struct objfile *main_objfile;
};
/* Data for OSO being processed. */
static struct macho_oso_data current_oso;
static void static void
macho_new_init (struct objfile *objfile) macho_new_init (struct objfile *objfile)
{ {
...@@ -297,8 +314,6 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, ...@@ -297,8 +314,6 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd,
struct objfile *main_objfile, int symfile_flags) struct objfile *main_objfile, int symfile_flags)
{ {
struct objfile *objfile; struct objfile *objfile;
struct section_addr_info *addrs;
int len;
int i; int i;
char leading_char; char leading_char;
...@@ -314,56 +329,58 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, ...@@ -314,56 +329,58 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd,
} }
bfd_set_cacheable (abfd, 1); bfd_set_cacheable (abfd, 1);
/* Compute addr length. */ /* Relocate sections. */
len = 0;
for (i = 0; i < oso->num_sections; i++)
if (oso->symbols[i] != NULL)
len++;
addrs = alloc_section_addr_info (len);
leading_char = bfd_get_symbol_leading_char (main_objfile->obfd); leading_char = bfd_get_symbol_leading_char (main_objfile->obfd);
len = 0;
for (i = 0; i < oso->num_sections; i++) for (i = 0; i < oso->num_sections; i++)
if (oso->symbols[i] != NULL)
{
if (oso->offsets[i])
addrs->other[len].addr = oso->offsets[i];
else
{
struct minimal_symbol *msym;
const char *name = oso->symbols[i]->name;
if (name[0] == leading_char)
++name;
if (mach_o_debug_level > 3)
printf_unfiltered (_("resolve sect %s with %s\n"),
oso->symbols[i]->section->name,
oso->symbols[i]->name);
msym = lookup_minimal_symbol (name, NULL, main_objfile);
if (msym == NULL)
{
warning (_("can't find symbol '%s' in minsymtab"),
oso->symbols[i]->name);
addrs->other[len].addr = 0;
}
else
addrs->other[len].addr = SYMBOL_VALUE_ADDRESS (msym);
}
addrs->other[len].name = (char *)oso->symbols[i]->section->name;
len++;
}
if (mach_o_debug_level > 1)
{ {
int j; asection *sect;
for (j = 0; j < addrs->num_sections; j++) const char *sectname;
bfd_vma vma;
/* Empty slot. */
if (oso->symbols[i] == NULL)
continue;
if (oso->offsets[i])
vma = oso->offsets[i];
else
{
struct minimal_symbol *msym;
const char *name = oso->symbols[i]->name;
if (name[0] == leading_char)
++name;
if (mach_o_debug_level > 3)
printf_unfiltered (_("resolve sect %s with %s\n"),
oso->symbols[i]->section->name,
oso->symbols[i]->name);
msym = lookup_minimal_symbol (name, NULL, main_objfile);
if (msym == NULL)
{
warning (_("can't find symbol '%s' in minsymtab"), name);
continue;
}
else
vma = SYMBOL_VALUE_ADDRESS (msym);
}
sectname = (char *)oso->symbols[i]->section->name;
sect = bfd_get_section_by_name (abfd, sectname);
if (sect == NULL)
{
warning (_("can't find section '%s' in OSO file %s"),
sectname, oso->name);
continue;
}
bfd_set_section_vma (abfd, sect, vma);
if (mach_o_debug_level > 1)
printf_unfiltered (_(" %s: %s\n"), printf_unfiltered (_(" %s: %s\n"),
core_addr_to_string (addrs->other[j].addr), core_addr_to_string (vma), sectname);
addrs->other[j].name);
} }
/* Make sure that the filename was malloc'ed. The current filename comes /* Make sure that the filename was malloc'ed. The current filename comes
...@@ -371,13 +388,23 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, ...@@ -371,13 +388,23 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd,
is not managed by gdb. */ is not managed by gdb. */
abfd->filename = xstrdup (abfd->filename); abfd->filename = xstrdup (abfd->filename);
gdb_assert (current_oso.symbol_table == NULL);
current_oso.main_objfile = main_objfile;
/* We need to clear SYMFILE_MAINLINE to avoid interractive question /* We need to clear SYMFILE_MAINLINE to avoid interractive question
from symfile.c:symbol_file_add_with_addrs_or_offsets. */ from symfile.c:symbol_file_add_with_addrs_or_offsets. */
objfile = symbol_file_add_from_bfd objfile = symbol_file_add_from_bfd
(abfd, symfile_flags & ~SYMFILE_MAINLINE, addrs, (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
| OBJF_READNOW | OBJF_USERLOADED)); | OBJF_READNOW | OBJF_USERLOADED));
add_separate_debug_objfile (objfile, main_objfile); add_separate_debug_objfile (objfile, main_objfile);
current_oso.main_objfile = NULL;
if (current_oso.symbol_table)
{
xfree (current_oso.symbol_table);
current_oso.symbol_table = NULL;
}
} }
/* Read symbols from the vector of oso files. */ /* Read symbols from the vector of oso files. */
...@@ -688,6 +715,65 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) ...@@ -688,6 +715,65 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
macho_symfile_read_all_oso (objfile, symfile_flags); macho_symfile_read_all_oso (objfile, symfile_flags);
} }
static bfd_byte *
macho_symfile_relocate (struct objfile *objfile, asection *sectp,
bfd_byte *buf)
{
bfd *abfd = objfile->obfd;
/* We're only interested in sections with relocation
information. */
if ((sectp->flags & SEC_RELOC) == 0)
return NULL;
if (mach_o_debug_level > 0)
printf_unfiltered (_("Relocate section '%s' of %s\n"),
sectp->name, objfile->name);
if (current_oso.symbol_table == NULL)
{
int storage;
int i;
char leading_char;
storage = bfd_get_symtab_upper_bound (abfd);
current_oso.symbol_table = (asymbol **) xmalloc (storage);
bfd_canonicalize_symtab (abfd, current_oso.symbol_table);
leading_char = bfd_get_symbol_leading_char (abfd);
for (i = 0; current_oso.symbol_table[i]; i++)
{
asymbol *sym = current_oso.symbol_table[i];
if (bfd_is_com_section (sym->section))
{
/* This one must be solved. */
struct minimal_symbol *msym;
const char *name = sym->name;
if (name[0] == leading_char)
name++;
msym = lookup_minimal_symbol
(name, NULL, current_oso.main_objfile);
if (msym == NULL)
{
warning (_("can't find symbol '%s' in minsymtab"), name);
continue;
}
else
{
sym->section = &bfd_abs_section;
sym->value = SYMBOL_VALUE_ADDRESS (msym);
}
}
}
}
return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
}
static void static void
macho_symfile_finish (struct objfile *objfile) macho_symfile_finish (struct objfile *objfile)
{ {
...@@ -761,7 +847,7 @@ static struct sym_fns macho_sym_fns = { ...@@ -761,7 +847,7 @@ static struct sym_fns macho_sym_fns = {
default_symfile_segments, /* sym_segments: Get segment information from default_symfile_segments, /* sym_segments: Get segment information from
a file. */ a file. */
NULL, /* sym_read_linetable */ NULL, /* sym_read_linetable */
default_symfile_relocate, /* sym_relocate: Relocate a debug section. */ macho_symfile_relocate, /* sym_relocate: Relocate a debug section. */
NULL /* next: pointer to next struct sym_fns */ NULL /* next: pointer to next struct sym_fns */
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment