Generate PIC code so that we can create shared objects properly.

- Add got_table in TCCState. This approach is naive and the distance between executable code and GOT can be longer than 32bit.
- Handle R_X86_64_GOTPCREL properly. We use got_table for TCC_OUTPUT_MEMORY case for now.
- Fix load() and store() so that they access global variables via GOT.
This commit is contained in:
Shinichiro Hamaji
2009-04-13 00:27:04 +09:00
committed by grischka
parent 6c10429aa5
commit 830b7533c9
3 changed files with 128 additions and 34 deletions

7
tcc.c
View File

@ -544,9 +544,12 @@ struct TCCState {
FILE *outfile;
#ifdef TCC_TARGET_X86_64
/* buffer to store jump tables */
/* buffer to store jump tables used when the output is memory */
char *jmp_table;
int jmp_table_num;
/* buffer to store got tables used when the output is memory */
void **got_table;
int got_table_num;
#endif
};
@ -10505,6 +10508,7 @@ TCCState *tcc_new(void)
#ifdef TCC_TARGET_X86_64
s->jmp_table = NULL;
s->got_table = NULL;
#endif
return s;
}
@ -10544,6 +10548,7 @@ void tcc_delete(TCCState *s1)
#ifdef TCC_TARGET_X86_64
tcc_free(s1->jmp_table);
tcc_free(s1->got_table);
#endif
tcc_free(s1);
}