diff options
| author | Shinichiro Hamaji <shinichiro.hamaji _at_ gmail.com> | 2009-04-17 10:17:14 +0900 |
|---|---|---|
| committer | grischka <grischka> | 2009-04-18 15:08:02 +0200 |
| commit | 9a7173bf69cc1e620f33e2d08550a70d31674a0f (patch) | |
| tree | 493f0209507800ea5daaeb6644932854dc57caa3 /tcc.c | |
| parent | e6ba81b012b1ce6d7c451ef25d21330c638e1320 (diff) | |
| download | tinycc-9a7173bf69cc1e620f33e2d08550a70d31674a0f.tar.gz tinycc-9a7173bf69cc1e620f33e2d08550a70d31674a0f.tar.bz2 | |
x86-64: Fix tcc -run. We need extra memory for PLT and GOT.
Size of the extra buffer is too large for now.
Diffstat (limited to 'tcc.c')
| -rw-r--r-- | tcc.c | 31 |
1 files changed, 22 insertions, 9 deletions
@@ -545,6 +545,12 @@ struct TCCState { /* for tcc_relocate */ int runtime_added; + +#ifdef TCC_TARGET_X86_64 + /* write PLT and GOT here */ + char *runtime_plt_and_got; + unsigned int runtime_plt_and_got_offset; +#endif }; /* The current value can be: */ @@ -1311,12 +1317,7 @@ Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags) static void free_section(Section *s) { -#ifdef TCC_TARGET_X86_64 - /* after tcc_relocate(), some sections share the data buffer. - let's check if the data is allocated not to free the shared buffers */ - if (s->data_allocated) -#endif - tcc_free(s->data); + tcc_free(s->data); } /* realloc section and set its content to zero */ @@ -10327,14 +10328,22 @@ int tcc_relocate(TCCState *s1, void *ptr) offset = (offset + length + 15) & ~15; } +#ifdef TCC_TARGET_X86_64 + s1->runtime_plt_and_got_offset = 0; + s1->runtime_plt_and_got = (char *)(mem + offset); + /* double the size of the buffer for got and plt entries + XXX: calculate exact size for them? */ + offset *= 2; +#endif + + if (0 == mem) + return offset + 15; + /* relocate symbols */ relocate_syms(s1, 1); if (s1->nb_errors) return -1; - if (0 == mem) - return offset + 15; - /* relocate each section */ for(i = 1; i < s1->nb_sections; i++) { s = s1->sections[i]; @@ -10357,6 +10366,10 @@ int tcc_relocate(TCCState *s1, void *ptr) if (s->sh_flags & SHF_EXECINSTR) set_pages_executable(ptr, length); } +#ifdef TCC_TARGET_X86_64 + set_pages_executable(s1->runtime_plt_and_got, + s1->runtime_plt_and_got_offset); +#endif return 0; } |
