summaryrefslogtreecommitdiff
path: root/scripts/sorttable.h
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/sorttable.h')
-rw-r--r--scripts/sorttable.h25
1 files changed, 14 insertions, 11 deletions
diff --git a/scripts/sorttable.h b/scripts/sorttable.h
index 3daf37bb6b9a..cd4429c8a9f4 100644
--- a/scripts/sorttable.h
+++ b/scripts/sorttable.h
@@ -23,7 +23,6 @@
#undef sort_mcount_loc
#undef elf_mcount_loc
#undef do_sort
-#undef Elf_Sym
#undef ELF_ST_TYPE
#undef uint_t
#undef _r
@@ -36,7 +35,6 @@
# define sort_mcount_loc sort_mcount_loc_64
# define elf_mcount_loc elf_mcount_loc_64
# define do_sort do_sort_64
-# define Elf_Sym Elf64_Sym
# define ELF_ST_TYPE ELF64_ST_TYPE
# define uint_t uint64_t
# define _r r8
@@ -48,7 +46,6 @@
# define sort_mcount_loc sort_mcount_loc_32
# define elf_mcount_loc elf_mcount_loc_32
# define do_sort do_sort_32
-# define Elf_Sym Elf32_Sym
# define ELF_ST_TYPE ELF32_ST_TYPE
# define uint_t uint32_t
# define _r r
@@ -230,10 +227,13 @@ static int do_sort(Elf_Ehdr *ehdr,
Elf_Sym *sort_needed_sym = NULL;
Elf_Shdr *sort_needed_sec;
uint32_t *sort_needed_loc;
+ void *sym_start;
+ void *sym_end;
const char *secstrings;
const char *strtab;
char *extab_image;
int sort_need_index;
+ int symentsize;
int shentsize;
int idx;
int i;
@@ -376,12 +376,15 @@ static int do_sort(Elf_Ehdr *ehdr,
}
/* find the flag main_extable_sort_needed */
- for (sym = (void *)ehdr + _r(&symtab_sec->etype.sh_offset);
- sym < sym + _r(&symtab_sec->etype.sh_size) / sizeof(Elf_Sym);
- sym++) {
- if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
+ sym_start = (void *)ehdr + _r(&symtab_sec->etype.sh_offset);
+ sym_end = sym_start + _r(&symtab_sec->etype.sh_size);
+ symentsize = _r(&symtab_sec->etype.sh_entsize);
+
+ for (sym = sym_start; (void *)sym + symentsize < sym_end;
+ sym = (void *)sym + symentsize) {
+ if (ELF_ST_TYPE(sym->etype.st_info) != STT_OBJECT)
continue;
- if (!strcmp(strtab + r(&sym->st_name),
+ if (!strcmp(strtab + r(&sym->etype.st_name),
"main_extable_sort_needed")) {
sort_needed_sym = sym;
break;
@@ -395,13 +398,13 @@ static int do_sort(Elf_Ehdr *ehdr,
goto out;
}
- sort_need_index = get_secindex(r2(&sym->st_shndx),
- sort_needed_sym - symtab,
+ sort_need_index = get_secindex(r2(&sym->etype.st_shndx),
+ ((void *)sort_needed_sym - (void *)symtab) / symentsize,
symtab_shndx);
sort_needed_sec = get_index(shdr_start, shentsize, sort_need_index);
sort_needed_loc = (void *)ehdr +
_r(&sort_needed_sec->etype.sh_offset) +
- _r(&sort_needed_sym->st_value) -
+ _r(&sort_needed_sym->etype.st_value) -
_r(&sort_needed_sec->etype.sh_addr);
/* extable has been sorted, clear the flag */