183 gdb_byte *dyninfo_end;
184 int got_entry_size = 8;
185 int dt_mips_local_gotno = -1;
186 int dt_mips_gotsym = -1;
189 if (bfd_get_arch (abfd) != bfd_arch_alpha)
193 memset ((
char *) &si, 0,
sizeof (si));
199 gdb::byte_vector sym_sec (bfd_section_size (si.
sym_sect));
200 gdb::byte_vector str_sec (bfd_section_size (si.
str_sect));
201 gdb::byte_vector dyninfo_sec (bfd_section_size (si.
dyninfo_sect));
202 gdb::byte_vector got_sec (bfd_section_size (si.
got_sect));
204 if (!bfd_get_section_contents (abfd, si.
sym_sect, sym_sec.data (),
205 (file_ptr) 0, sym_sec.size ()))
207 if (!bfd_get_section_contents (abfd, si.
str_sect, str_sec.data (),
208 (file_ptr) 0, str_sec.size ()))
210 if (!bfd_get_section_contents (abfd, si.
dyninfo_sect, dyninfo_sec.data (),
211 (file_ptr) 0, dyninfo_sec.size ()))
213 if (!bfd_get_section_contents (abfd, si.
got_sect, got_sec.data (),
214 (file_ptr) 0, got_sec.size ()))
219 for ((dyninfo_p = dyninfo_sec.data (),
220 dyninfo_end = dyninfo_p + dyninfo_sec.size ());
221 dyninfo_p < dyninfo_end;
227 dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->
d_tag);
228 if (dyn_tag == DT_NULL)
230 else if (dyn_tag == DT_MIPS_LOCAL_GOTNO)
232 if (dt_mips_local_gotno < 0)
234 = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->
d_un.
d_val);
236 else if (dyn_tag == DT_MIPS_GOTSYM)
238 if (dt_mips_gotsym < 0)
240 = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp->
d_un.
d_val);
243 if (dt_mips_local_gotno < 0 || dt_mips_gotsym < 0)
249 stripped = (bfd_get_symcount (abfd) == 0);
259 unsigned char sym_info;
260 unsigned int sym_shndx;
264 strx = bfd_h_get_32 (abfd, (bfd_byte *) x_symp->
st_name);
265 if (strx >= str_sec.size ())
267 name = (
char *) (str_sec.data () + strx);
271 sym_value = bfd_h_get_64 (abfd, (bfd_byte *) x_symp->
st_value);
272 sym_info = bfd_h_get_8 (abfd, (bfd_byte *) x_symp->
st_info);
273 sym_shndx = bfd_h_get_16 (abfd, (bfd_byte *) x_symp->
st_shndx);
274 if (sym_shndx >= (SHN_LORESERVE & 0xffff))
275 sym_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
276 isglobal = (ELF_ST_BIND (sym_info) == STB_GLOBAL);
278 if (sym_shndx == SHN_UNDEF)
282 if (ELF_ST_TYPE (sym_info) != STT_FUNC
283 || ELF_ST_BIND (sym_info) != STB_GLOBAL)
305 int got_entry_offset =
306 (i - dt_mips_gotsym + dt_mips_local_gotno) * got_entry_size;
308 if (got_entry_offset < 0
309 || got_entry_offset >= got_sec.size ())
313 (bfd_byte *) (got_sec.data ()
314 + got_entry_offset));
328 if (sym_shndx == SHN_MIPS_TEXT)
335 else if (sym_shndx == SHN_MIPS_DATA)
342 else if (sym_shndx == SHN_MIPS_ACOMMON)
349 else if (sym_shndx == SHN_ABS)
359 reader.
record (
name, unrelocated_addr (sym_value), ms_type);