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:
committed by
grischka
parent
6c10429aa5
commit
830b7533c9
7
tcc.c
7
tcc.c
@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user