64
64
#define EM_LOONGARCH 258
65
65
#endif
66
66
67
+ typedef union {
68
+ Elf32_Ehdr e32 ;
69
+ Elf64_Ehdr e64 ;
70
+ } Elf_Ehdr ;
71
+
67
72
static uint32_t (* r )(const uint32_t * );
68
73
static uint16_t (* r2 )(const uint16_t * );
69
74
static uint64_t (* r8 )(const uint64_t * );
@@ -266,10 +271,10 @@ static void sort_relative_table_with_data(char *extab_image, int image_size)
266
271
static int do_file (char const * const fname , void * addr )
267
272
{
268
273
int rc = -1 ;
269
- Elf32_Ehdr * ehdr = addr ;
274
+ Elf_Ehdr * ehdr = addr ;
270
275
table_sort_t custom_sort = NULL ;
271
276
272
- switch (ehdr -> e_ident [EI_DATA ]) {
277
+ switch (ehdr -> e32 . e_ident [EI_DATA ]) {
273
278
case ELFDATA2LSB :
274
279
r = rle ;
275
280
r2 = r2le ;
@@ -284,18 +289,18 @@ static int do_file(char const *const fname, void *addr)
284
289
break ;
285
290
default :
286
291
fprintf (stderr , "unrecognized ELF data encoding %d: %s\n" ,
287
- ehdr -> e_ident [EI_DATA ], fname );
292
+ ehdr -> e32 . e_ident [EI_DATA ], fname );
288
293
return -1 ;
289
294
}
290
295
291
- if (memcmp (ELFMAG , ehdr -> e_ident , SELFMAG ) != 0 ||
292
- (r2 (& ehdr -> e_type ) != ET_EXEC && r2 (& ehdr -> e_type ) != ET_DYN ) ||
293
- ehdr -> e_ident [EI_VERSION ] != EV_CURRENT ) {
296
+ if (memcmp (ELFMAG , ehdr -> e32 . e_ident , SELFMAG ) != 0 ||
297
+ (r2 (& ehdr -> e32 . e_type ) != ET_EXEC && r2 (& ehdr -> e32 . e_type ) != ET_DYN ) ||
298
+ ehdr -> e32 . e_ident [EI_VERSION ] != EV_CURRENT ) {
294
299
fprintf (stderr , "unrecognized ET_EXEC/ET_DYN file %s\n" , fname );
295
300
return -1 ;
296
301
}
297
302
298
- switch (r2 (& ehdr -> e_machine )) {
303
+ switch (r2 (& ehdr -> e32 . e_machine )) {
299
304
case EM_386 :
300
305
case EM_AARCH64 :
301
306
case EM_LOONGARCH :
@@ -318,14 +323,14 @@ static int do_file(char const *const fname, void *addr)
318
323
break ;
319
324
default :
320
325
fprintf (stderr , "unrecognized e_machine %d %s\n" ,
321
- r2 (& ehdr -> e_machine ), fname );
326
+ r2 (& ehdr -> e32 . e_machine ), fname );
322
327
return -1 ;
323
328
}
324
329
325
- switch (ehdr -> e_ident [EI_CLASS ]) {
330
+ switch (ehdr -> e32 . e_ident [EI_CLASS ]) {
326
331
case ELFCLASS32 :
327
- if (r2 (& ehdr -> e_ehsize ) != sizeof (Elf32_Ehdr ) ||
328
- r2 (& ehdr -> e_shentsize ) != sizeof (Elf32_Shdr )) {
332
+ if (r2 (& ehdr -> e32 . e_ehsize ) != sizeof (Elf32_Ehdr ) ||
333
+ r2 (& ehdr -> e32 . e_shentsize ) != sizeof (Elf32_Shdr )) {
329
334
fprintf (stderr ,
330
335
"unrecognized ET_EXEC/ET_DYN file: %s\n" , fname );
331
336
break ;
@@ -334,20 +339,19 @@ static int do_file(char const *const fname, void *addr)
334
339
break ;
335
340
case ELFCLASS64 :
336
341
{
337
- Elf64_Ehdr * const ghdr = (Elf64_Ehdr * )ehdr ;
338
- if (r2 (& ghdr -> e_ehsize ) != sizeof (Elf64_Ehdr ) ||
339
- r2 (& ghdr -> e_shentsize ) != sizeof (Elf64_Shdr )) {
342
+ if (r2 (& ehdr -> e64 .e_ehsize ) != sizeof (Elf64_Ehdr ) ||
343
+ r2 (& ehdr -> e64 .e_shentsize ) != sizeof (Elf64_Shdr )) {
340
344
fprintf (stderr ,
341
345
"unrecognized ET_EXEC/ET_DYN file: %s\n" ,
342
346
fname );
343
347
break ;
344
348
}
345
- rc = do_sort_64 (ghdr , fname , custom_sort );
349
+ rc = do_sort_64 (ehdr , fname , custom_sort );
346
350
}
347
351
break ;
348
352
default :
349
353
fprintf (stderr , "unrecognized ELF class %d %s\n" ,
350
- ehdr -> e_ident [EI_CLASS ], fname );
354
+ ehdr -> e32 . e_ident [EI_CLASS ], fname );
351
355
break ;
352
356
}
353
357
0 commit comments