void read_bfd_symbols()
{
IntPtr symtab;
int num_symbols = bfd_glue_get_symbols (bfd, out symtab);
symbols = new Hashtable ();
local_symbols = new Hashtable ();
simple_symbols = new ArrayList ();
bool is_mach = (bfd_glue_get_target_name (bfd) == "mach-o-le");
for (int i = 0; i < num_symbols; i++) {
string name;
long address;
int is_function;
name = bfd_glue_get_symbol (bfd, symtab, i, out is_function, out address);
if (name == null)
continue;
if(is_mach) {
if(name[0] == '_')
name = name.Substring(1);
}
TargetAddress relocated = new TargetAddress (
info.AddressDomain, base_address.Address + address);
if (is_function != 0 && !symbols.Contains (name))
symbols.Add (name, relocated);
else if (name.StartsWith ("MONO_DEBUGGER__") && !symbols.Contains (name))
symbols.Add (name, relocated);
else if (!local_symbols.Contains (name))
local_symbols.Add (name, relocated);
simple_symbols.Add (new Symbol (name, relocated, 0));
}
g_free (symtab);
num_symbols = bfd_glue_get_dynamic_symbols (bfd, out symtab);
for (int i = 0; i < num_symbols; i++) {
string name;
long address;
int is_function;
name = bfd_glue_get_symbol (bfd, symtab, i, out is_function, out address);
if (name == null)
continue;
TargetAddress relocated = new TargetAddress (
info.AddressDomain,
base_address.Address + address);
simple_symbols.Add (new Symbol (name, relocated, 0));
}
g_free (symtab);
simple_symtab = new BfdSymbolTable (this);
}