X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=scripts%2Fsortextable.c;h=5f7a8b663cb9c9eb59b32f4ce63076a6a86914cc;hb=4e8d2139802ce4f41936a687f06c560b12115247;hp=7c2310c5b996dee9d43df56574b30236342c3c81;hpb=389e067032fbb96e439abafae848dd447e4cafb4;p=~andy%2Flinux diff --git a/scripts/sortextable.c b/scripts/sortextable.c index 7c2310c5b99..5f7a8b663cb 100644 --- a/scripts/sortextable.c +++ b/scripts/sortextable.c @@ -152,6 +152,30 @@ static void (*w2)(uint16_t, uint16_t *); typedef void (*table_sort_t)(char *, int); +/* + * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of + * the way to -256..-1, to avoid conflicting with real section + * indices. + */ +#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1)) + +static inline int is_shndx_special(unsigned int i) +{ + return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE; +} + +/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */ +static inline unsigned int get_secindex(unsigned int shndx, + unsigned int sym_offs, + const Elf32_Word *symtab_shndx_start) +{ + if (is_shndx_special(shndx)) + return SPECIAL(shndx); + if (shndx != SHN_XINDEX) + return shndx; + return r(&symtab_shndx_start[sym_offs]); +} + /* 32 bit and 64 bit are very similar */ #include "sortextable.h" #define SORTEXTABLE_64