23
23
#undef sort_mcount_loc
24
24
#undef elf_mcount_loc
25
25
#undef do_sort
26
- #undef Elf_Shdr
27
26
#undef Elf_Sym
28
27
#undef ELF_ST_TYPE
29
28
#undef uint_t
37
36
# define sort_mcount_loc sort_mcount_loc_64
38
37
# define elf_mcount_loc elf_mcount_loc_64
39
38
# define do_sort do_sort_64
40
- # define Elf_Shdr Elf64_Shdr
41
39
# define Elf_Sym Elf64_Sym
42
40
# define ELF_ST_TYPE ELF64_ST_TYPE
43
41
# define uint_t uint64_t
50
48
# define sort_mcount_loc sort_mcount_loc_32
51
49
# define elf_mcount_loc elf_mcount_loc_32
52
50
# define do_sort do_sort_32
53
- # define Elf_Shdr Elf32_Shdr
54
51
# define Elf_Sym Elf32_Sym
55
52
# define ELF_ST_TYPE ELF32_ST_TYPE
56
53
# define uint_t uint32_t
@@ -171,8 +168,8 @@ struct elf_mcount_loc {
171
168
static void * sort_mcount_loc (void * arg )
172
169
{
173
170
struct elf_mcount_loc * emloc = (struct elf_mcount_loc * )arg ;
174
- uint_t offset = emloc -> start_mcount_loc - _r (& (emloc -> init_data_sec )-> sh_addr )
175
- + _r (& (emloc -> init_data_sec )-> sh_offset );
171
+ uint_t offset = emloc -> start_mcount_loc - _r (& (emloc -> init_data_sec )-> etype . sh_addr )
172
+ + _r (& (emloc -> init_data_sec )-> etype . sh_offset );
176
173
uint_t count = emloc -> stop_mcount_loc - emloc -> start_mcount_loc ;
177
174
unsigned char * start_loc = (void * )emloc -> ehdr + offset ;
178
175
@@ -222,10 +219,11 @@ static int do_sort(Elf_Ehdr *ehdr,
222
219
table_sort_t custom_sort )
223
220
{
224
221
int rc = -1 ;
225
- Elf_Shdr * s , * shdr = ( Elf_Shdr * )(( char * ) ehdr + _r ( & ehdr -> etype . e_shoff )) ;
222
+ Elf_Shdr * shdr_start ;
226
223
Elf_Shdr * strtab_sec = NULL ;
227
224
Elf_Shdr * symtab_sec = NULL ;
228
225
Elf_Shdr * extab_sec = NULL ;
226
+ Elf_Shdr * string_sec ;
229
227
Elf_Sym * sym ;
230
228
const Elf_Sym * symtab ;
231
229
Elf32_Word * symtab_shndx = NULL ;
@@ -235,7 +233,10 @@ static int do_sort(Elf_Ehdr *ehdr,
235
233
const char * secstrings ;
236
234
const char * strtab ;
237
235
char * extab_image ;
236
+ int sort_need_index ;
237
+ int shentsize ;
238
238
int idx ;
239
+ int i ;
239
240
unsigned int shnum ;
240
241
unsigned int shstrndx ;
241
242
#ifdef MCOUNT_SORT_ENABLED
@@ -249,34 +250,40 @@ static int do_sort(Elf_Ehdr *ehdr,
249
250
unsigned int orc_num_entries = 0 ;
250
251
#endif
251
252
253
+ shdr_start = (Elf_Shdr * )((char * )ehdr + _r (& ehdr -> etype .e_shoff ));
254
+ shentsize = r2 (& ehdr -> etype .e_shentsize );
255
+
252
256
shstrndx = r2 (& ehdr -> etype .e_shstrndx );
253
257
if (shstrndx == SHN_XINDEX )
254
- shstrndx = r (& shdr [0 ].sh_link );
255
- secstrings = (const char * )ehdr + _r (& shdr [shstrndx ].sh_offset );
258
+ shstrndx = r (& shdr_start -> etype .sh_link );
259
+ string_sec = get_index (shdr_start , shentsize , shstrndx );
260
+ secstrings = (const char * )ehdr + _r (& string_sec -> etype .sh_offset );
256
261
257
262
shnum = r2 (& ehdr -> etype .e_shnum );
258
263
if (shnum == SHN_UNDEF )
259
- shnum = _r (& shdr [0 ].sh_size );
264
+ shnum = _r (& shdr_start -> etype .sh_size );
265
+
266
+ for (i = 0 ; i < shnum ; i ++ ) {
267
+ Elf_Shdr * shdr = get_index (shdr_start , shentsize , i );
260
268
261
- for (s = shdr ; s < shdr + shnum ; s ++ ) {
262
- idx = r (& s -> sh_name );
269
+ idx = r (& shdr -> etype .sh_name );
263
270
if (!strcmp (secstrings + idx , "__ex_table" ))
264
- extab_sec = s ;
271
+ extab_sec = shdr ;
265
272
if (!strcmp (secstrings + idx , ".symtab" ))
266
- symtab_sec = s ;
273
+ symtab_sec = shdr ;
267
274
if (!strcmp (secstrings + idx , ".strtab" ))
268
- strtab_sec = s ;
275
+ strtab_sec = shdr ;
269
276
270
- if (r (& s -> sh_type ) == SHT_SYMTAB_SHNDX )
277
+ if (r (& shdr -> etype . sh_type ) == SHT_SYMTAB_SHNDX )
271
278
symtab_shndx = (Elf32_Word * )((const char * )ehdr +
272
- _r (& s -> sh_offset ));
279
+ _r (& shdr -> etype . sh_offset ));
273
280
274
281
#ifdef MCOUNT_SORT_ENABLED
275
282
/* locate the .init.data section in vmlinux */
276
283
if (!strcmp (secstrings + idx , ".init.data" )) {
277
284
get_mcount_loc (& _start_mcount_loc , & _stop_mcount_loc );
278
285
mstruct .ehdr = ehdr ;
279
- mstruct .init_data_sec = s ;
286
+ mstruct .init_data_sec = shdr ;
280
287
mstruct .start_mcount_loc = _start_mcount_loc ;
281
288
mstruct .stop_mcount_loc = _stop_mcount_loc ;
282
289
}
@@ -285,14 +292,14 @@ static int do_sort(Elf_Ehdr *ehdr,
285
292
#if defined(SORTTABLE_64 ) && defined(UNWINDER_ORC_ENABLED )
286
293
/* locate the ORC unwind tables */
287
294
if (!strcmp (secstrings + idx , ".orc_unwind_ip" )) {
288
- orc_ip_size = _r (& s -> sh_size );
295
+ orc_ip_size = _r (& shdr -> etype . sh_size );
289
296
g_orc_ip_table = (int * )((void * )ehdr +
290
- _r (& s -> sh_offset ));
297
+ _r (& shdr -> etype . sh_offset ));
291
298
}
292
299
if (!strcmp (secstrings + idx , ".orc_unwind" )) {
293
- orc_size = _r (& s -> sh_size );
300
+ orc_size = _r (& shdr -> etype . sh_size );
294
301
g_orc_table = (struct orc_entry * )((void * )ehdr +
295
- _r (& s -> sh_offset ));
302
+ _r (& shdr -> etype . sh_offset ));
296
303
}
297
304
#endif
298
305
} /* for loop */
@@ -355,22 +362,22 @@ static int do_sort(Elf_Ehdr *ehdr,
355
362
goto out ;
356
363
}
357
364
358
- extab_image = (void * )ehdr + _r (& extab_sec -> sh_offset );
359
- strtab = (const char * )ehdr + _r (& strtab_sec -> sh_offset );
365
+ extab_image = (void * )ehdr + _r (& extab_sec -> etype . sh_offset );
366
+ strtab = (const char * )ehdr + _r (& strtab_sec -> etype . sh_offset );
360
367
symtab = (const Elf_Sym * )((const char * )ehdr +
361
- _r (& symtab_sec -> sh_offset ));
368
+ _r (& symtab_sec -> etype . sh_offset ));
362
369
363
370
if (custom_sort ) {
364
- custom_sort (extab_image , _r (& extab_sec -> sh_size ));
371
+ custom_sort (extab_image , _r (& extab_sec -> etype . sh_size ));
365
372
} else {
366
- int num_entries = _r (& extab_sec -> sh_size ) / extable_ent_size ;
373
+ int num_entries = _r (& extab_sec -> etype . sh_size ) / extable_ent_size ;
367
374
qsort (extab_image , num_entries ,
368
375
extable_ent_size , compare_extable );
369
376
}
370
377
371
378
/* find the flag main_extable_sort_needed */
372
- for (sym = (void * )ehdr + _r (& symtab_sec -> sh_offset );
373
- sym < sym + _r (& symtab_sec -> sh_size ) / sizeof (Elf_Sym );
379
+ for (sym = (void * )ehdr + _r (& symtab_sec -> etype . sh_offset );
380
+ sym < sym + _r (& symtab_sec -> etype . sh_size ) / sizeof (Elf_Sym );
374
381
sym ++ ) {
375
382
if (ELF_ST_TYPE (sym -> st_info ) != STT_OBJECT )
376
383
continue ;
@@ -388,13 +395,14 @@ static int do_sort(Elf_Ehdr *ehdr,
388
395
goto out ;
389
396
}
390
397
391
- sort_needed_sec = & shdr [get_secindex (r2 (& sym -> st_shndx ),
392
- sort_needed_sym - symtab ,
393
- symtab_shndx )];
398
+ sort_need_index = get_secindex (r2 (& sym -> st_shndx ),
399
+ sort_needed_sym - symtab ,
400
+ symtab_shndx );
401
+ sort_needed_sec = get_index (shdr_start , shentsize , sort_need_index );
394
402
sort_needed_loc = (void * )ehdr +
395
- _r (& sort_needed_sec -> sh_offset ) +
403
+ _r (& sort_needed_sec -> etype . sh_offset ) +
396
404
_r (& sort_needed_sym -> st_value ) -
397
- _r (& sort_needed_sec -> sh_addr );
405
+ _r (& sort_needed_sec -> etype . sh_addr );
398
406
399
407
/* extable has been sorted, clear the flag */
400
408
w (0 , sort_needed_loc );
0 commit comments