aboutsummaryrefslogtreecommitdiff
path: root/tccpe.c
diff options
context:
space:
mode:
authorgrischka <grischka>2009-12-19 19:14:01 +0100
committergrischka <grischka>2009-12-19 22:16:18 +0100
commit1445fea5827a948996e1c7bea24df4c0df79f432 (patch)
tree11c5e6192d922d8329b9a8349cb7ad67e337669b /tccpe.c
parentb5e22384836d5c09602d5cf6fe990485299dfbf0 (diff)
downloadtinycc-1445fea5827a948996e1c7bea24df4c0df79f432.tar.gz
tinycc-1445fea5827a948996e1c7bea24df4c0df79f432.tar.bz2
tccpe: allow linkage to extern symbols from asm
Diffstat (limited to 'tccpe.c')
-rw-r--r--tccpe.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/tccpe.c b/tccpe.c
index 9b6c524..41de3f6 100644
--- a/tccpe.c
+++ b/tccpe.c
@@ -1185,6 +1185,21 @@ ST_FN void pe_relocate_rva (struct pe_info *pe, Section *s)
}
/*----------------------------------------------------------------------------*/
+static int pe_isafunc(int sym_index)
+{
+ Section *sr = text_section->reloc;
+ ElfW_Rel *rel, *rel_end;
+ Elf32_Word info = ELF32_R_INFO(sym_index, R_386_PC32);
+ if (!sr)
+ return 0;
+ rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);
+ for (rel = (ElfW_Rel *)sr->data; rel < rel_end; rel++)
+ if (rel->r_info == info)
+ return 1;
+ return 0;
+}
+
+/*----------------------------------------------------------------------------*/
ST_FN int pe_check_symbols(struct pe_info *pe)
{
ElfW(Sym) *sym;
@@ -1210,6 +1225,14 @@ ST_FN int pe_check_symbols(struct pe_info *pe)
if (!is)
goto not_found;
+ if (type == STT_NOTYPE) {
+ /* symbols from assembler have no type, find out which */
+ if (pe_isafunc(sym_index))
+ type = STT_FUNC;
+ else
+ type = STT_OBJECT;
+ }
+
if (type == STT_FUNC) {
unsigned long offset = is->thk_offset;
if (offset) {