aboutsummaryrefslogtreecommitdiff
path: root/tccelf.c
diff options
context:
space:
mode:
authorgrischka <grischka>2007-10-30 15:13:21 +0000
committergrischka <grischka>2007-10-30 15:13:21 +0000
commit2bcc187b1bbb6e3240400652af1a73cd799f250c (patch)
tree4fd69c72d6e61c501ef64bf954a6bd0ac2d006c1 /tccelf.c
parentd13aa5426ad17479407dc0a0aad4f6e37f8aa797 (diff)
downloadtinycc-2bcc187b1bbb6e3240400652af1a73cd799f250c.tar.gz
tinycc-2bcc187b1bbb6e3240400652af1a73cd799f250c.tar.bz2
Fix 'invalid relocation entry' problem on ubuntu - from Bernhard Fischer
Diffstat (limited to 'tccelf.c')
-rw-r--r--tccelf.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/tccelf.c b/tccelf.c
index 5525244..4dfbcfe 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -1874,7 +1874,6 @@ static int tcc_load_object_file(TCCState *s1,
/* second short pass to update sh_link and sh_info fields of new
sections */
- sm = sm_table;
for(i = 1; i < ehdr.e_shnum; i++) {
s = sm_table[i].s;
if (!s || !sm_table[i].new_section)
@@ -1888,6 +1887,7 @@ static int tcc_load_object_file(TCCState *s1,
s1->sections[s->sh_info]->reloc = s;
}
}
+ sm = sm_table;
/* resolve symbols */
old_to_new_syms = tcc_mallocz(nb_syms * sizeof(int));
@@ -1949,9 +1949,11 @@ static int tcc_load_object_file(TCCState *s1,
if (sym_index >= nb_syms)
goto invalid_reloc;
sym_index = old_to_new_syms[sym_index];
- if (!sym_index) {
+ /* ignore link_once in rel section. */
+ if (!sym_index && !sm->link_once) {
invalid_reloc:
- error_noabort("Invalid relocation entry");
+ error_noabort("Invalid relocation entry [%2d] '%s' @ %.8x",
+ i, strsec + sh->sh_name, rel->r_offset);
goto fail;
}
rel->r_info = ELF32_R_INFO(sym_index, type);