void read_dynamic_info(Inferior inferior)
{
if (has_dynlink_info) {
if (!first_link_map.IsNull)
do_update_shlib_info (inferior);
return;
}
TargetAddress debug_base = main_bfd.ReadDynamicInfo (inferior);
if (debug_base.IsNull)
return;
int size = 2 * inferior.TargetLongIntegerSize + 3 * inferior.TargetAddressSize;
TargetReader reader = new TargetReader (inferior.ReadMemory (debug_base, size));
if (reader.ReadLongInteger () != 1)
return;
first_link_map = reader.ReadAddress ();
dynlink_breakpoint_addr = reader.ReadAddress ();
rdebug_state_addr = debug_base + reader.Offset;
if (reader.ReadLongInteger () != 0)
return;
has_dynlink_info = true;
Instruction insn = inferior.Architecture.ReadInstruction (inferior, dynlink_breakpoint_addr);
if ((insn == null) || !insn.CanInterpretInstruction)
throw new InternalError ("Unknown dynlink breakpoint: {0}", dynlink_breakpoint_addr);
dynlink_breakpoint = new DynlinkBreakpoint (this, insn);
dynlink_breakpoint.Insert (inferior);
do_update_shlib_info (inferior);
check_loaded_library (inferior, main_bfd);
}