win64: hi-mem adjustments
- x86_64-link.c: ignore relocation overflow to undefined (weak) symbols - 104_inline.test: test lower 32 bits only - tccpe.c: support -Wl,--image-base=... above the 32bit range
This commit is contained in:
parent
c03d59eae0
commit
d76e03232b
3 changed files with 12 additions and 8 deletions
14
tccpe.c
14
tccpe.c
|
@ -324,7 +324,7 @@ static const DWORD pe_sec_flags[] = {
|
||||||
struct section_info {
|
struct section_info {
|
||||||
int cls;
|
int cls;
|
||||||
char name[32];
|
char name[32];
|
||||||
DWORD sh_addr;
|
ADDR3264 sh_addr;
|
||||||
DWORD sh_size;
|
DWORD sh_size;
|
||||||
DWORD pe_flags;
|
DWORD pe_flags;
|
||||||
Section *sec;
|
Section *sec;
|
||||||
|
@ -451,9 +451,9 @@ static DWORD pe_file_align(struct pe_info *pe, DWORD n)
|
||||||
return (n + (pe->file_align - 1)) & ~(pe->file_align - 1);
|
return (n + (pe->file_align - 1)) & ~(pe->file_align - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD pe_virtual_align(struct pe_info *pe, DWORD n)
|
static ADDR3264 pe_virtual_align(struct pe_info *pe, ADDR3264 n)
|
||||||
{
|
{
|
||||||
return (n + (pe->section_align - 1)) & ~(pe->section_align - 1);
|
return (n + (pe->section_align - 1)) & ~(ADDR3264)(pe->section_align - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pe_align_section(Section *s, int a)
|
static void pe_align_section(Section *s, int a)
|
||||||
|
@ -1108,7 +1108,7 @@ static int pe_section_class(Section *s)
|
||||||
static int pe_assign_addresses (struct pe_info *pe)
|
static int pe_assign_addresses (struct pe_info *pe)
|
||||||
{
|
{
|
||||||
int i, k, n, c, nbs;
|
int i, k, n, c, nbs;
|
||||||
DWORD addr;
|
ADDR3264 addr;
|
||||||
int *sec_order, *sec_cls;
|
int *sec_order, *sec_cls;
|
||||||
struct section_info *si;
|
struct section_info *si;
|
||||||
Section *s;
|
Section *s;
|
||||||
|
@ -1198,7 +1198,7 @@ add_section:
|
||||||
Section *s = s1->sections[sec_order[i]];
|
Section *s = s1->sections[sec_order[i]];
|
||||||
int type = s->sh_type;
|
int type = s->sh_type;
|
||||||
int flags = s->sh_flags;
|
int flags = s->sh_flags;
|
||||||
printf("section %-16s %-10s %08x %04x %s,%s,%s\n",
|
printf("section %-16s %-10s %p %04x %s,%s,%s\n",
|
||||||
s->name,
|
s->name,
|
||||||
type == SHT_PROGBITS ? "progbits" :
|
type == SHT_PROGBITS ? "progbits" :
|
||||||
type == SHT_INIT_ARRAY ? "initarr" :
|
type == SHT_INIT_ARRAY ? "initarr" :
|
||||||
|
@ -1207,7 +1207,7 @@ add_section:
|
||||||
type == SHT_SYMTAB ? "symtab" :
|
type == SHT_SYMTAB ? "symtab" :
|
||||||
type == SHT_STRTAB ? "strtab" :
|
type == SHT_STRTAB ? "strtab" :
|
||||||
type == SHT_RELX ? "rel" : "???",
|
type == SHT_RELX ? "rel" : "???",
|
||||||
(unsigned)s->sh_addr,
|
s->sh_addr,
|
||||||
(unsigned)s->data_offset,
|
(unsigned)s->data_offset,
|
||||||
flags & SHF_ALLOC ? "alloc" : "",
|
flags & SHF_ALLOC ? "alloc" : "",
|
||||||
flags & SHF_WRITE ? "write" : "",
|
flags & SHF_WRITE ? "write" : "",
|
||||||
|
@ -1280,7 +1280,7 @@ static int pe_check_symbols(struct pe_info *pe)
|
||||||
is = pe_add_import(pe, imp_sym);
|
is = pe_add_import(pe, imp_sym);
|
||||||
|
|
||||||
if (type == STT_FUNC) {
|
if (type == STT_FUNC) {
|
||||||
unsigned long offset = is->thk_offset;
|
unsigned offset = is->thk_offset;
|
||||||
if (offset) {
|
if (offset) {
|
||||||
/* got aliased symbol, like stricmp and _stricmp */
|
/* got aliased symbol, like stricmp and _stricmp */
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#define GOT(f) \
|
#define GOT(f) \
|
||||||
__attribute__((weak)) void f(void); \
|
__attribute__((weak)) void f(void); \
|
||||||
printf("%d %s\n", !!f, #f);
|
printf("%d %s\n", !!((__SIZE_TYPE__)f & ~0u), #f);
|
||||||
|
|
||||||
int printf(const char*, ...);
|
int printf(const char*, ...);
|
||||||
|
|
||||||
|
|
|
@ -247,6 +247,10 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t
|
||||||
long long diff;
|
long long diff;
|
||||||
diff = (long long)val - addr;
|
diff = (long long)val - addr;
|
||||||
if (diff < -2147483648LL || diff > 2147483647LL) {
|
if (diff < -2147483648LL || diff > 2147483647LL) {
|
||||||
|
#ifdef TCC_TARGET_PE
|
||||||
|
/* ignore overflow with undefined weak symbols */
|
||||||
|
if (((ElfW(Sym)*)symtab_section->data)[sym_index].st_shndx != SHN_UNDEF)
|
||||||
|
#endif
|
||||||
tcc_error("internal error: relocation failed");
|
tcc_error("internal error: relocation failed");
|
||||||
}
|
}
|
||||||
add32le(ptr, diff);
|
add32le(ptr, diff);
|
||||||
|
|
Loading…
Reference in a new issue