From 8f6390061d4e839ad57d69ceb227e4f957b658de Mon Sep 17 00:00:00 2001 From: seyko Date: Mon, 23 Mar 2015 19:24:55 +0300 Subject: [PATCH] fix for: x86_64-tcc compiled by i386-tcc is wrong A test program (must be compiled by the above version of the tcc): /* Tickle a bug in TinyC on 64-bit systems: * the LSB of the top word or ARGP gets set * for no obvious reason. * * Source: a legacy language interpreter which * has a little stack / stack pointer for arguments. * * Output is: 0x8049620 0x10804961c * Should be: 0x8049620 0x804961c */ #include #define NARGS 20000 int ARG[NARGS]; int *ARGSPACE = ARG; int *ARGP = ARG - 1; main() { printf("%p %p\n", ARGSPACE, ARGP); } --- libtcc.c | 2 +- tcc.h | 4 ++-- tccelf.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libtcc.c b/libtcc.c index b04a5cb..eb69438 100644 --- a/libtcc.c +++ b/libtcc.c @@ -540,7 +540,7 @@ ST_FUNC void put_extern_sym(Sym *sym, Section *section, /* add a new relocation entry to symbol 'sym' in section 's' */ ST_FUNC void greloca(Section *s, Sym *sym, unsigned long offset, int type, - unsigned long addend) + addr_t addend) { int c = 0; if (sym) { diff --git a/tcc.h b/tcc.h index 25c691a..bd6828c 100644 --- a/tcc.h +++ b/tcc.h @@ -1095,7 +1095,7 @@ ST_FUNC Section *find_section(TCCState *s1, const char *name); ST_FUNC void put_extern_sym2(Sym *sym, Section *section, addr_t value, unsigned long size, int can_add_underscore); ST_FUNC void put_extern_sym(Sym *sym, Section *section, addr_t value, unsigned long size); ST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type); -ST_FUNC void greloca(Section *s, Sym *sym, unsigned long offset, int type, unsigned long addend); +ST_FUNC void greloca(Section *s, Sym *sym, unsigned long offset, int type, addr_t addend); ST_INLN void sym_free(Sym *sym); ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c); @@ -1285,7 +1285,7 @@ ST_FUNC int put_elf_sym(Section *s, addr_t value, unsigned long size, int info, ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, int info, int other, int sh_num, const char *name); ST_FUNC int find_elf_sym(Section *s, const char *name); ST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol); -ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, int type, int symbol, unsigned long addend); +ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, int type, int symbol, addr_t addend); ST_FUNC void put_stabs(const char *str, int type, int other, int desc, unsigned long value); ST_FUNC void put_stabs_r(const char *str, int type, int other, int desc, unsigned long value, Section *sec, int sym_index); diff --git a/tccelf.c b/tccelf.c index 26cdb59..5f526df 100644 --- a/tccelf.c +++ b/tccelf.c @@ -270,7 +270,7 @@ ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, /* put relocation */ ST_FUNC void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, - int type, int symbol, unsigned long addend) + int type, int symbol, addr_t addend) { char buf[256]; Section *sr;