fix stabstr with linked objects

tcc-xref
grischka 2008-04-27 18:49:31 +00:00
parent 0d598aca08
commit 5247bbc2f0
2 changed files with 33 additions and 1 deletions

2
tcc.c
View File

@ -9148,6 +9148,8 @@ void put_func_debug(Sym *sym)
funcname, sym->type.t & VT_STATIC ? 'f' : 'F'); funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
put_stabs_r(buf, N_FUN, 0, file->line_num, 0, put_stabs_r(buf, N_FUN, 0, file->line_num, 0,
cur_text_section, sym->c); cur_text_section, sym->c);
/* //gr gdb wants a line at the function */
put_stabn(N_SLINE, 0, file->line_num, 0);
last_ind = 0; last_ind = 0;
last_line_num = 0; last_line_num = 0;
} }

View File

@ -1821,6 +1821,11 @@ static int tcc_load_object_file(TCCState *s1,
Elf32_Rel *rel, *rel_end; Elf32_Rel *rel, *rel_end;
Section *s; Section *s;
int stab_index;
int stabstr_index;
stab_index = stabstr_index = 0;
if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr)) if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
goto fail1; goto fail1;
if (ehdr.e_ident[0] != ELFMAG0 || if (ehdr.e_ident[0] != ELFMAG0 ||
@ -1885,7 +1890,9 @@ static int tcc_load_object_file(TCCState *s1,
#ifdef TCC_ARM_EABI #ifdef TCC_ARM_EABI
sh->sh_type != SHT_ARM_EXIDX && sh->sh_type != SHT_ARM_EXIDX &&
#endif #endif
sh->sh_type != SHT_NOBITS) sh->sh_type != SHT_NOBITS &&
strcmp(sh_name, ".stabstr")
)
continue; continue;
if (sh->sh_addralign < 1) if (sh->sh_addralign < 1)
sh->sh_addralign = 1; sh->sh_addralign = 1;
@ -1921,11 +1928,22 @@ static int tcc_load_object_file(TCCState *s1,
/* align start of section */ /* align start of section */
offset = s->data_offset; offset = s->data_offset;
if (0 == strcmp(sh_name, ".stab")) {
stab_index = i;
goto no_align;
}
if (0 == strcmp(sh_name, ".stabstr")) {
stabstr_index = i;
goto no_align;
}
size = sh->sh_addralign - 1; size = sh->sh_addralign - 1;
offset = (offset + size) & ~size; offset = (offset + size) & ~size;
if (sh->sh_addralign > s->sh_addralign) if (sh->sh_addralign > s->sh_addralign)
s->sh_addralign = sh->sh_addralign; s->sh_addralign = sh->sh_addralign;
s->data_offset = offset; s->data_offset = offset;
no_align:
sm_table[i].offset = offset; sm_table[i].offset = offset;
sm_table[i].s = s; sm_table[i].s = s;
/* concatenate sections */ /* concatenate sections */
@ -1941,6 +1959,18 @@ static int tcc_load_object_file(TCCState *s1,
next: ; next: ;
} }
/* //gr relocate stab strings */
if (stab_index && stabstr_index) {
Stab_Sym *a, *b;
unsigned o;
s = sm_table[stab_index].s;
a = (Stab_Sym *)(s->data + sm_table[stab_index].offset);
b = (Stab_Sym *)(s->data + s->data_offset);
o = sm_table[stabstr_index].offset;
while (a < b)
a->n_strx += o, a++;
}
/* second short pass to update sh_link and sh_info fields of new /* second short pass to update sh_link and sh_info fields of new
sections */ sections */
for(i = 1; i < ehdr.e_shnum; i++) { for(i = 1; i < ehdr.e_shnum; i++) {