Generate PLT thumb stub only when necessary
Generate PLT thumb stub for an ARM PLT entry only when at least one Thumb instruction branches to that entry. Warning: To save space, this commit reuses the bit 0 of entries of got_offsets array. The GOT offset is thus saved in a 31 bit value. Make sure to divide by 2 (right shift by 1) an offset before storing it there and conversely to multiply the value by 2 (left shift by 1) before using it.
This commit is contained in:
11
tcc.h
11
tcc.h
@ -33,6 +33,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
@ -524,11 +525,15 @@ struct TCCState {
|
||||
Section **priv_sections;
|
||||
int nb_priv_sections; /* number of private sections */
|
||||
|
||||
/* got handling */
|
||||
/* got & plt handling */
|
||||
Section *got;
|
||||
Section *plt;
|
||||
unsigned long *got_offsets;
|
||||
int nb_got_offsets;
|
||||
struct {
|
||||
unsigned long plt_thumb_stub:1;
|
||||
/* mult by 2 (or left shift by 1) before use */
|
||||
unsigned long got_offset:(sizeof(long)*CHAR_BIT-1);
|
||||
} *sym_infos;
|
||||
int nb_sym_infos;
|
||||
/* give the correspondance from symtab indexes to dynsym indexes */
|
||||
int *symtab_to_dynsym;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user