262
264
/* If it's apparently in a GOT or PLT, it's really a reference to a
263
265
symbol defined elsewhere, so ignore it. */
264
if (si->got_start_vma != 0
265
&& sym_addr >= si->got_start_vma
266
&& sym_addr < si->got_start_vma + si->got_size) {
266
if (si->got_start_avma != 0
267
&& sym_addr >= si->got_start_avma
268
&& sym_addr < si->got_start_avma + si->got_size) {
267
269
TRACE_SYMTAB(" ignore -- in GOT: %s\n", sym_name);
270
if (si->plt_start_vma != 0
271
&& sym_addr >= si->plt_start_vma
272
&& sym_addr < si->plt_start_vma + si->plt_size) {
272
if (si->plt_start_avma != 0
273
&& sym_addr >= si->plt_start_avma
274
&& sym_addr < si->plt_start_avma + si->plt_size) {
273
275
TRACE_SYMTAB(" ignore -- in PLT: %s\n", sym_name);
954
962
mapped = mapped & ~(VKI_PAGE_SIZE-1);
955
963
mapped_end = (mapped_end + VKI_PAGE_SIZE - 1) & ~(VKI_PAGE_SIZE-1);
957
if (VG_(needs).data_syms &&
958
(mapped >= si->start && mapped <= (si->start+si->size)) &&
959
(mapped_end > (si->start+si->size))) {
960
UInt newsz = mapped_end - si->start;
961
if (newsz > si->size) {
965
if (VG_(needs).data_syms
966
&& mapped >= si->text_start_avma
967
&& mapped <= (si->text_start_avma + si->text_size)
968
&& mapped_end > (si->text_start_avma + si->text_size)) {
969
/* XXX jrs 2007 Jan 11: what's going on here? If data
970
syms are involved, surely we shouldn't be messing with
971
the segment's text_size unless there is an assumption
972
that the data segment has been mapped immediately after
973
the text segment. Which doesn't sound good to me. */
974
UInt newsz = mapped_end - si->text_start_avma;
975
if (newsz > si->text_size) {
963
977
VG_(printf)("extending mapping %p..%p %d -> ..%p %d\n",
964
si->start, si->start+si->size, si->size,
965
si->start+newsz, newsz);
979
si->text_start_avma + si->text_size,
981
si->text_start_avma + newsz, newsz);
983
si->text_size = newsz;
973
si->offset = offset_oimage;
989
si->text_bias = offset_oimage;
991
if (VG_(clo_verbosity) > 2 || VG_(clo_trace_redir))
992
VG_(message)(Vg_DebugMsg, " svma %010p, avma %010p",
993
si->text_start_avma - si->text_bias,
994
si->text_start_avma );
975
996
/* If, after looking at all the program headers, we still didn't
976
997
find a soname, add a fake one. */
993
1014
/* Find interesting sections, read the symbol table(s), read any debug
996
/* Pointers to start of sections (in the oimage, not in the
998
UChar* o_strtab = NULL; /* .strtab */
999
ElfXX_Sym* o_symtab = NULL; /* .symtab */
1000
UChar* o_dynstr = NULL; /* .dynstr */
1001
ElfXX_Sym* o_dynsym = NULL; /* .dynsym */
1002
Char* debuglink = NULL; /* .gnu_debuglink */
1003
UChar* stab = NULL; /* .stab (stabs) */
1004
UChar* stabstr = NULL; /* .stabstr (stabs) */
1005
UChar* debug_line = NULL; /* .debug_line (dwarf2) */
1006
UChar* debug_info = NULL; /* .debug_info (dwarf2) */
1007
UChar* debug_abbv = NULL; /* .debug_abbrev (dwarf2) */
1008
UChar* debug_str = NULL; /* .debug_str (dwarf2) */
1009
UChar* dwarf1d = NULL; /* .debug (dwarf1) */
1010
UChar* dwarf1l = NULL; /* .line (dwarf1) */
1011
UChar* ehframe = NULL; /* .eh_frame (dwarf2) */
1012
UChar* opd_filea = NULL; /* .opd (dwarf2, ppc64-linux) */
1013
UChar* dummy_filea = NULL;
1017
/* IMAGE addresses: pointers to start of sections (in the
1018
oimage, not in the running image) -- image addresses */
1019
UChar* strtab_img = NULL; /* .strtab */
1020
ElfXX_Sym* symtab_img = NULL; /* .symtab */
1021
UChar* dynstr_img = NULL; /* .dynstr */
1022
ElfXX_Sym* dynsym_img = NULL; /* .dynsym */
1023
Char* debuglink_img = NULL; /* .gnu_debuglink */
1024
UChar* stab_img = NULL; /* .stab (stabs) */
1025
UChar* stabstr_img = NULL; /* .stabstr (stabs) */
1026
UChar* debug_line_img = NULL; /* .debug_line (dwarf2) */
1027
UChar* debug_info_img = NULL; /* .debug_info (dwarf2) */
1028
UChar* debug_abbv_img = NULL; /* .debug_abbrev (dwarf2) */
1029
UChar* debug_str_img = NULL; /* .debug_str (dwarf2) */
1030
UChar* dwarf1d_img = NULL; /* .debug (dwarf1) */
1031
UChar* dwarf1l_img = NULL; /* .line (dwarf1) */
1032
UChar* ehframe_img = NULL; /* .eh_frame (dwarf2) */
1033
UChar* opd_filea_img = NULL; /* .opd (dwarf2, ppc64-linux) */
1034
UChar* dummy_filea_img = NULL;
1015
OffT o_symtab_offset = offset_oimage;
1016
OffT o_dynsym_offset = offset_oimage;
1036
OffT symtab_offset = offset_oimage;
1037
OffT dynsym_offset = offset_oimage;
1017
1038
OffT debug_offset = offset_oimage;
1018
1039
OffT opd_offset = offset_oimage;
1020
1041
/* Section sizes, in bytes */
1021
UInt o_strtab_sz = 0;
1022
UInt o_symtab_sz = 0;
1023
UInt o_dynstr_sz = 0;
1024
UInt o_dynsym_sz = 0;
1025
1046
UInt debuglink_sz = 0;
1026
1047
UInt stab_sz = 0;
1027
1048
UInt stabstr_sz = 0;
1074
1095
/* Nb: must find where .got and .plt sections will be in the
1075
1096
* executable image, not in the object image transiently loaded. */
1076
/* NAME SIZE ADDR_IN_OIMAGE ADDR_WHEN_MAPPED */
1077
FIND(".dynsym", o_dynsym_sz, o_dynsym, dummy_vma)
1078
FIND(".dynstr", o_dynstr_sz, o_dynstr, dummy_vma)
1079
FIND(".symtab", o_symtab_sz, o_symtab, dummy_vma)
1080
FIND(".strtab", o_strtab_sz, o_strtab, dummy_vma)
1082
FIND(".gnu_debuglink", debuglink_sz, debuglink, dummy_vma)
1084
FIND(".stab", stab_sz, stab, dummy_vma)
1085
FIND(".stabstr", stabstr_sz, stabstr, dummy_vma)
1087
FIND(".debug_line", debug_line_sz, debug_line, dummy_vma)
1088
FIND(".debug_info", debug_info_sz, debug_info, dummy_vma)
1089
FIND(".debug_abbrev", debug_abbv_sz, debug_abbv, dummy_vma)
1090
FIND(".debug_str", debug_str_sz, debug_str, dummy_vma)
1092
FIND(".debug", dwarf1d_sz, dwarf1d, dummy_vma)
1093
FIND(".line", dwarf1l_sz, dwarf1l, dummy_vma)
1094
FIND(".eh_frame", ehframe_sz, ehframe, ehframe_vma)
1096
FIND(".got", si->got_size, dummy_filea, si->got_start_vma)
1097
FIND(".plt", si->plt_size, dummy_filea, si->plt_start_vma)
1098
FIND(".opd", si->opd_size, opd_filea, si->opd_start_vma)
1097
/* NAME SIZE IMAGE addr AVMA */
1098
FIND(".dynsym", dynsym_sz, dynsym_img, dummy_avma)
1099
FIND(".dynstr", dynstr_sz, dynstr_img, dummy_avma)
1100
FIND(".symtab", symtab_sz, symtab_img, dummy_avma)
1101
FIND(".strtab", strtab_sz, strtab_img, dummy_avma)
1103
FIND(".gnu_debuglink", debuglink_sz, debuglink_img, dummy_avma)
1105
FIND(".stab", stab_sz, stab_img, dummy_avma)
1106
FIND(".stabstr", stabstr_sz, stabstr_img, dummy_avma)
1108
FIND(".debug_line", debug_line_sz, debug_line_img, dummy_avma)
1109
FIND(".debug_info", debug_info_sz, debug_info_img, dummy_avma)
1110
FIND(".debug_abbrev", debug_abbv_sz, debug_abbv_img, dummy_avma)
1111
FIND(".debug_str", debug_str_sz, debug_str_img, dummy_avma)
1113
FIND(".debug", dwarf1d_sz, dwarf1d_img, dummy_avma)
1114
FIND(".line", dwarf1l_sz, dwarf1l_img, dummy_avma)
1115
FIND(".eh_frame", ehframe_sz, ehframe_img, ehframe_avma)
1117
FIND(".got", si->got_size, dummy_filea_img, si->got_start_avma)
1118
FIND(".plt", si->plt_size, dummy_filea_img, si->plt_start_avma)
1119
FIND(".opd", si->opd_size, opd_filea_img, si->opd_start_avma)
1103
1124
/* Did we find a debuglink section? */
1104
if (debuglink != NULL) {
1105
UInt crc_offset = VG_ROUNDUP(VG_(strlen)(debuglink)+1, 4);
1125
if (debuglink_img != NULL) {
1126
UInt crc_offset = VG_ROUNDUP(VG_(strlen)(debuglink_img)+1, 4);
1108
1129
vg_assert(crc_offset + sizeof(UInt) <= debuglink_sz);
1110
1131
/* Extract the CRC from the debuglink section */
1111
crc = *(UInt *)(debuglink + crc_offset);
1132
crc = *(UInt *)(debuglink_img + crc_offset);
1113
1134
/* See if we can find a matching debug file */
1114
if ((dimage = find_debug_file(si->filename, debuglink, crc, &n_dimage)) != 0) {
1135
dimage = find_debug_file(si->filename, debuglink_img, crc, &n_dimage);
1115
1137
ehdr = (ElfXX_Ehdr*)dimage;
1117
1139
if (n_dimage >= sizeof(ElfXX_Ehdr)
1119
1141
&& ehdr->e_phoff + ehdr->e_phnum*sizeof(ElfXX_Phdr) <= n_dimage
1120
1142
&& ehdr->e_shoff + ehdr->e_shnum*sizeof(ElfXX_Shdr) <= n_dimage)
1122
Bool need_symtab = (NULL == o_symtab);
1144
Bool need_symtab = (NULL == symtab_img);
1145
Bool need_stabs = (NULL == stab_img);
1146
Bool need_dwarf2 = (NULL == debug_info_img);
1147
Bool need_dwarf1 = (NULL == dwarf1d_img);
1124
1149
for (i = 0; i < ehdr->e_phnum; i++) {
1125
1150
ElfXX_Phdr *o_phdr = &((ElfXX_Phdr *)(dimage + ehdr->e_phoff))[i];
1126
1151
if (o_phdr->p_type == PT_LOAD) {
1127
offset_dimage = si->start - o_phdr->p_vaddr;
1152
offset_dimage = si->text_start_avma - o_phdr->p_vaddr;
1132
1157
debug_offset = offset_dimage;
1133
1158
if (need_symtab)
1134
o_symtab_offset = offset_dimage;
1159
symtab_offset = offset_dimage;
1136
1161
shdr = (ElfXX_Shdr*)(dimage + ehdr->e_shoff);
1137
1162
sh_strtab = (UChar*)(dimage + shdr[ehdr->e_shstrndx].sh_offset);
1139
1164
/* Same deal as previous FIND, except simpler - doesn't
1140
look for vma, only oimage address. */
1165
look for avma, only oimage address. */
1142
1167
/* Find all interesting sections */
1143
1168
for (i = 0; i < ehdr->e_shnum; i++) {
1164
FIND(need_symtab, ".symtab", o_symtab_sz, o_symtab)
1165
FIND(need_symtab, ".strtab", o_strtab_sz, o_strtab)
1166
FIND(1, ".stab", stab_sz, stab)
1167
FIND(1, ".stabstr", stabstr_sz, stabstr)
1168
FIND(1, ".debug_line", debug_line_sz, debug_line)
1169
FIND(1, ".debug_info", debug_info_sz, debug_info)
1170
FIND(1, ".debug_abbrev", debug_abbv_sz, debug_abbv)
1171
FIND(1, ".debug_str", debug_str_sz, debug_str)
1172
FIND(1, ".debug", dwarf1d_sz, dwarf1d)
1173
FIND(1, ".line", dwarf1l_sz, dwarf1l)
1189
/* ?? NAME SIZE IMAGE addr */
1190
FIND(need_symtab, ".symtab", symtab_sz, symtab_img)
1191
FIND(need_symtab, ".strtab", strtab_sz, strtab_img)
1192
FIND(need_stabs, ".stab", stab_sz, stab_img)
1193
FIND(need_stabs, ".stabstr", stabstr_sz, stabstr_img)
1194
FIND(need_dwarf2, ".debug_line", debug_line_sz, debug_line_img)
1195
FIND(need_dwarf2, ".debug_info", debug_info_sz, debug_info_img)
1196
FIND(need_dwarf2, ".debug_abbrev", debug_abbv_sz, debug_abbv_img)
1197
FIND(need_dwarf2, ".debug_str", debug_str_sz, debug_str_img)
1198
FIND(need_dwarf1, ".debug", dwarf1d_sz, dwarf1d_img)
1199
FIND(need_dwarf1, ".line", dwarf1l_sz, dwarf1l_img)
1192
1218
read_elf_symtab = read_elf_symtab__normal;
1194
1220
read_elf_symtab(si, "symbol table",
1195
o_symtab, o_symtab_sz, o_symtab_offset,
1196
o_strtab, o_strtab_sz, opd_filea, opd_offset);
1221
symtab_img, symtab_sz, symtab_offset,
1222
strtab_img, strtab_sz,
1223
opd_filea_img, opd_offset);
1198
1225
read_elf_symtab(si, "dynamic symbol table",
1199
o_dynsym, o_dynsym_sz, o_dynsym_offset,
1200
o_dynstr, o_dynstr_sz, opd_filea, opd_offset);
1226
dynsym_img, dynsym_sz, dynsym_offset,
1227
dynstr_img, dynstr_sz,
1228
opd_filea_img, opd_offset);
1203
1231
/* Read .eh_frame (call-frame-info) if any */
1205
ML_(read_callframe_info_dwarf2) ( si, ehframe, ehframe_sz, ehframe_vma );
1233
ML_(read_callframe_info_dwarf3)
1234
( si, ehframe_img, ehframe_sz, ehframe_avma );
1208
1237
/* Read the stabs and/or dwarf2 debug information, if any. It
1209
1238
appears reading stabs stuff on amd64-linux doesn't work, so
1210
1239
we ignore it. */
1211
1240
# if !defined(VGP_amd64_linux)
1212
if (stab && stabstr) {
1213
ML_(read_debuginfo_stabs) ( si, debug_offset, stab, stab_sz,
1214
stabstr, stabstr_sz );
1241
if (stab_img && stabstr_img) {
1242
ML_(read_debuginfo_stabs) ( si, debug_offset, stab_img, stab_sz,
1243
stabstr_img, stabstr_sz );
1217
1246
/* jrs 2006-01-01: icc-8.1 has been observed to generate
1219
1248
debuginfo reading for that reason, but, in
1220
1249
read_unitinfo_dwarf2, do check that debugstr is non-NULL
1221
1250
before using it. */
1222
if (debug_info && debug_abbv && debug_line /* && debug_str */) {
1251
if (debug_info_img && debug_abbv_img && debug_line_img
1252
/* && debug_str_img */) {
1223
1253
ML_(read_debuginfo_dwarf2) ( si, debug_offset,
1224
debug_info, debug_info_sz,
1226
debug_line, debug_line_sz,
1254
debug_info_img, debug_info_sz,
1256
debug_line_img, debug_line_sz,
1229
if (dwarf1d && dwarf1l) {
1230
ML_(read_debuginfo_dwarf1) ( si, dwarf1d, dwarf1d_sz,
1231
dwarf1l, dwarf1l_sz );
1259
if (dwarf1d_img && dwarf1l_img) {
1260
ML_(read_debuginfo_dwarf1) ( si, dwarf1d_img, dwarf1d_sz,
1261
dwarf1l_img, dwarf1l_sz );