mirror of
https://github.com/frida/tinycc
synced 2024-12-24 05:56:49 +03:00
Allow to get sym attr and fail if no entry
Change alloc_sym_attr into get_sym_attr and add a parameter to control whether to allocate a new symattr structure or return NULL if symbol is not found;
This commit is contained in:
parent
a11b0a67e3
commit
2c38800bbe
6
tcc.h
6
tcc.h
@ -570,6 +570,7 @@ typedef struct ASMOperand {
|
||||
} ASMOperand;
|
||||
#endif
|
||||
|
||||
/* extra symbol attributes (not in symbol table) */
|
||||
struct sym_attr {
|
||||
unsigned long got_offset;
|
||||
unsigned long plt_offset;
|
||||
@ -708,8 +709,6 @@ struct TCCState {
|
||||
/* got & plt handling */
|
||||
Section *got;
|
||||
Section *plt;
|
||||
struct sym_attr *sym_attrs;
|
||||
int nb_sym_attrs;
|
||||
/* give the correspondance from symtab indexes to dynsym indexes */
|
||||
int *symtab_to_dynsym;
|
||||
|
||||
@ -719,6 +718,9 @@ struct TCCState {
|
||||
Section *dynsym;
|
||||
/* copy of the gobal symtab_section variable */
|
||||
Section *symtab;
|
||||
/* extra attributes (eg. GOT/PLT value) for symtab symbols */
|
||||
struct sym_attr *sym_attrs;
|
||||
int nb_sym_attrs;
|
||||
/* tiny assembler state */
|
||||
Sym *asm_labels;
|
||||
|
||||
|
44
tccelf.c
44
tccelf.c
@ -542,6 +542,27 @@ ST_FUNC void put_stabd(int type, int other, int desc)
|
||||
put_stabs(NULL, type, other, desc, 0);
|
||||
}
|
||||
|
||||
static struct sym_attr *get_sym_attr(TCCState *s1, int index, int alloc)
|
||||
{
|
||||
int n;
|
||||
struct sym_attr *tab;
|
||||
|
||||
if (index >= s1->nb_sym_attrs) {
|
||||
if (!alloc)
|
||||
return NULL;
|
||||
/* find immediately bigger power of 2 and reallocate array */
|
||||
n = 1;
|
||||
while (index >= n)
|
||||
n *= 2;
|
||||
tab = tcc_realloc(s1->sym_attrs, n * sizeof(*s1->sym_attrs));
|
||||
s1->sym_attrs = tab;
|
||||
memset(s1->sym_attrs + s1->nb_sym_attrs, 0,
|
||||
(n - s1->nb_sym_attrs) * sizeof(*s1->sym_attrs));
|
||||
s1->nb_sym_attrs = n;
|
||||
}
|
||||
return &s1->sym_attrs[index];
|
||||
}
|
||||
|
||||
/* Browse each elem of type <type> in section <sec> starting at elem <startoff>
|
||||
using variable <elem> */
|
||||
#define for_each_elem(sec, startoff, elem, type) \
|
||||
@ -768,25 +789,6 @@ static int prepare_dynamic_rel(TCCState *s1, Section *sr)
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct sym_attr *alloc_sym_attr(TCCState *s1, int index)
|
||||
{
|
||||
int n;
|
||||
struct sym_attr *tab;
|
||||
|
||||
if (index >= s1->nb_sym_attrs) {
|
||||
/* find immediately bigger power of 2 and reallocate array */
|
||||
n = 1;
|
||||
while (index >= n)
|
||||
n *= 2;
|
||||
tab = tcc_realloc(s1->sym_attrs, n * sizeof(*s1->sym_attrs));
|
||||
s1->sym_attrs = tab;
|
||||
memset(s1->sym_attrs + s1->nb_sym_attrs, 0,
|
||||
(n - s1->nb_sym_attrs) * sizeof(*s1->sym_attrs));
|
||||
s1->nb_sym_attrs = n;
|
||||
}
|
||||
return &s1->sym_attrs[index];
|
||||
}
|
||||
|
||||
static void build_got(TCCState *s1)
|
||||
{
|
||||
unsigned char *ptr;
|
||||
@ -851,7 +853,7 @@ static unsigned long put_got_entry(TCCState *s1, int dyn_reloc_type,
|
||||
return s1->sym_attrs[sym_index].got_offset;
|
||||
}
|
||||
|
||||
symattr = alloc_sym_attr(s1, sym_index);
|
||||
symattr = get_sym_attr(s1, sym_index, 1);
|
||||
|
||||
/* create the GOT entry */
|
||||
ptr = section_ptr_add(s1->got, PTR_SIZE);
|
||||
@ -2619,7 +2621,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1,
|
||||
switch to ARM mode. We set bit plt_thumb_stub of the
|
||||
attribute of a symbol to indicate such a case. */
|
||||
if (type == R_ARM_THM_JUMP24)
|
||||
alloc_sym_attr(s1, sym_index)->plt_thumb_stub = 1;
|
||||
get_sym_attr(s1, sym_index, 1)->plt_thumb_stub = 1;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user