@@ -152,6 +152,53 @@ SHDR_WORD(link)
SHDR_WORD(name)
SHDR_WORD(type)
+#define SYM_ADDR(fn_name) \
+static uint64_t sym64_##fn_name(Elf_Sym *sym) \
+{ \
+ return r8(&sym->e64.st_##fn_name); \
+} \
+ \
+static uint64_t sym32_##fn_name(Elf_Sym *sym) \
+{ \
+ return r(&sym->e32.st_##fn_name); \
+}
+
+#define SYM_WORD(fn_name) \
+static uint32_t sym64_##fn_name(Elf_Sym *sym) \
+{ \
+ return r(&sym->e64.st_##fn_name); \
+} \
+ \
+static uint32_t sym32_##fn_name(Elf_Sym *sym) \
+{ \
+ return r(&sym->e32.st_##fn_name); \
+}
+
+#define SYM_HALF(fn_name) \
+static uint16_t sym64_##fn_name(Elf_Sym *sym) \
+{ \
+ return r2(&sym->e64.st_##fn_name); \
+} \
+ \
+static uint16_t sym32_##fn_name(Elf_Sym *sym) \
+{ \
+ return r2(&sym->e32.st_##fn_name); \
+}
+
+static uint8_t sym64_type(Elf_Sym *sym)
+{
+ return ELF64_ST_TYPE(sym->e64.st_info);
+}
+
+static uint8_t sym32_type(Elf_Sym *sym)
+{
+ return ELF32_ST_TYPE(sym->e32.st_info);
+}
+
+SYM_ADDR(value)
+SYM_WORD(name)
+SYM_HALF(shndx)
+
/*
* Get the whole file as a programming convenience in order to avoid
* malloc+lseek+read+free of many pieces. If successful, then mmap
@@ -23,10 +23,7 @@
#undef sort_mcount_loc
#undef elf_mcount_loc
#undef do_sort
-#undef ELF_ST_TYPE
#undef uint_t
-#undef _r
-#undef etype
#undef ehdr_shoff
#undef ehdr_shentsize
#undef ehdr_shstrndx
@@ -38,6 +35,10 @@
#undef shdr_name
#undef shdr_type
#undef shdr_entsize
+#undef sym_type
+#undef sym_name
+#undef sym_value
+#undef sym_shndx
#ifdef SORTTABLE_64
# define extable_ent_size 16
@@ -46,10 +47,7 @@
# define sort_mcount_loc sort_mcount_loc_64
# define elf_mcount_loc elf_mcount_loc_64
# define do_sort do_sort_64
-# define ELF_ST_TYPE ELF64_ST_TYPE
# define uint_t uint64_t
-# define _r r8
-# define etype e64
# define ehdr_shoff ehdr64_shoff
# define ehdr_shentsize ehdr64_shentsize
# define ehdr_shstrndx ehdr64_shstrndx
@@ -61,6 +59,10 @@
# define shdr_name shdr64_name
# define shdr_type shdr64_type
# define shdr_entsize shdr64_entsize
+# define sym_type sym64_type
+# define sym_name sym64_name
+# define sym_value sym64_value
+# define sym_shndx sym64_shndx
#else
# define extable_ent_size 8
# define compare_extable compare_extable_32
@@ -68,10 +70,7 @@
# define sort_mcount_loc sort_mcount_loc_32
# define elf_mcount_loc elf_mcount_loc_32
# define do_sort do_sort_32
-# define ELF_ST_TYPE ELF32_ST_TYPE
# define uint_t uint32_t
-# define _r r
-# define etype e32
# define ehdr_shoff ehdr32_shoff
# define ehdr_shentsize ehdr32_shentsize
# define ehdr_shstrndx ehdr32_shstrndx
@@ -83,6 +82,10 @@
# define shdr_name shdr32_name
# define shdr_type shdr32_type
# define shdr_entsize shdr32_entsize
+# define sym_type sym32_type
+# define sym_name sym32_name
+# define sym_value sym32_value
+# define sym_shndx sym32_shndx
#endif
#if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED)
@@ -411,9 +414,9 @@ static int do_sort(Elf_Ehdr *ehdr,
for (sym = sym_start; (void *)sym + symentsize < sym_end;
sym = (void *)sym + symentsize) {
- if (ELF_ST_TYPE(sym->etype.st_info) != STT_OBJECT)
+ if (sym_type(sym) != STT_OBJECT)
continue;
- if (!strcmp(strtab + r(&sym->etype.st_name),
+ if (!strcmp(strtab + sym_name(sym),
"main_extable_sort_needed")) {
sort_needed_sym = sym;
break;
@@ -427,14 +430,13 @@ static int do_sort(Elf_Ehdr *ehdr,
goto out;
}
- sort_need_index = get_secindex(r2(&sym->etype.st_shndx),
+ sort_need_index = get_secindex(sym_shndx(sym),
((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 +
shdr_offset(sort_needed_sec) +
- _r(&sort_needed_sym->etype.st_value) -
- shdr_addr(sort_needed_sec);
+ sym_value(sort_needed_sym) - shdr_addr(sort_needed_sec);
/* extable has been sorted, clear the flag */
w(0, sort_needed_loc);