23
23
#undef sort_mcount_loc
24
24
#undef elf_mcount_loc
25
25
#undef do_sort
26
- #undef Elf_Sym
27
26
#undef ELF_ST_TYPE
28
27
#undef uint_t
29
28
#undef _r
36
35
# define sort_mcount_loc sort_mcount_loc_64
37
36
# define elf_mcount_loc elf_mcount_loc_64
38
37
# define do_sort do_sort_64
39
- # define Elf_Sym Elf64_Sym
40
38
# define ELF_ST_TYPE ELF64_ST_TYPE
41
39
# define uint_t uint64_t
42
40
# define _r r8
48
46
# define sort_mcount_loc sort_mcount_loc_32
49
47
# define elf_mcount_loc elf_mcount_loc_32
50
48
# define do_sort do_sort_32
51
- # define Elf_Sym Elf32_Sym
52
49
# define ELF_ST_TYPE ELF32_ST_TYPE
53
50
# define uint_t uint32_t
54
51
# define _r r
@@ -230,10 +227,13 @@ static int do_sort(Elf_Ehdr *ehdr,
230
227
Elf_Sym * sort_needed_sym = NULL ;
231
228
Elf_Shdr * sort_needed_sec ;
232
229
uint32_t * sort_needed_loc ;
230
+ void * sym_start ;
231
+ void * sym_end ;
233
232
const char * secstrings ;
234
233
const char * strtab ;
235
234
char * extab_image ;
236
235
int sort_need_index ;
236
+ int symentsize ;
237
237
int shentsize ;
238
238
int idx ;
239
239
int i ;
@@ -376,12 +376,15 @@ static int do_sort(Elf_Ehdr *ehdr,
376
376
}
377
377
378
378
/* find the flag main_extable_sort_needed */
379
- for (sym = (void * )ehdr + _r (& symtab_sec -> etype .sh_offset );
380
- sym < sym + _r (& symtab_sec -> etype .sh_size ) / sizeof (Elf_Sym );
381
- sym ++ ) {
382
- if (ELF_ST_TYPE (sym -> st_info ) != STT_OBJECT )
379
+ sym_start = (void * )ehdr + _r (& symtab_sec -> etype .sh_offset );
380
+ sym_end = sym_start + _r (& symtab_sec -> etype .sh_size );
381
+ symentsize = _r (& symtab_sec -> etype .sh_entsize );
382
+
383
+ for (sym = sym_start ; (void * )sym + symentsize < sym_end ;
384
+ sym = (void * )sym + symentsize ) {
385
+ if (ELF_ST_TYPE (sym -> etype .st_info ) != STT_OBJECT )
383
386
continue ;
384
- if (!strcmp (strtab + r (& sym -> st_name ),
387
+ if (!strcmp (strtab + r (& sym -> etype . st_name ),
385
388
"main_extable_sort_needed" )) {
386
389
sort_needed_sym = sym ;
387
390
break ;
@@ -395,13 +398,13 @@ static int do_sort(Elf_Ehdr *ehdr,
395
398
goto out ;
396
399
}
397
400
398
- sort_need_index = get_secindex (r2 (& sym -> st_shndx ),
399
- sort_needed_sym - symtab ,
401
+ sort_need_index = get_secindex (r2 (& sym -> etype . st_shndx ),
402
+ (( void * ) sort_needed_sym - ( void * ) symtab ) / symentsize ,
400
403
symtab_shndx );
401
404
sort_needed_sec = get_index (shdr_start , shentsize , sort_need_index );
402
405
sort_needed_loc = (void * )ehdr +
403
406
_r (& sort_needed_sec -> etype .sh_offset ) +
404
- _r (& sort_needed_sym -> st_value ) -
407
+ _r (& sort_needed_sym -> etype . st_value ) -
405
408
_r (& sort_needed_sec -> etype .sh_addr );
406
409
407
410
/* extable has been sorted, clear the flag */
0 commit comments