@@ -273,14 +273,6 @@ static void elf_load_bsdsyms(struct elf_
if ( !elf->bsd_symtab_pstart )
return;
-#define elf_store_field_bitness(_elf, _hdr, _elm, _val) \
-do { \
- if ( elf_64bit(_elf) ) \
- elf_store_field(_elf, _hdr, e64._elm, _val); \
- else \
- elf_store_field(_elf, _hdr, e32._elm, _val); \
-} while ( 0 )
-
#define SYMTAB_INDEX 1
#define STRTAB_INDEX 2
@@ -308,16 +300,16 @@ do {
elf_uval(elf, elf->ehdr, e_ehsize));
/* Set the offset to the shdr array. */
- elf_store_field_bitness(elf, header_handle, e_shoff,
- offsetof(typeof(header.elf_header), section));
+ elf_store_field(elf, header_handle, e_shoff,
+ offsetof(typeof(header.elf_header), section));
/* Set the right number of section headers. */
- elf_store_field_bitness(elf, header_handle, e_shnum, ELF_BSDSYM_SECTIONS);
+ elf_store_field(elf, header_handle, e_shnum, ELF_BSDSYM_SECTIONS);
/* Clear a couple of fields we don't use. */
- elf_store_field_bitness(elf, header_handle, e_phoff, 0);
- elf_store_field_bitness(elf, header_handle, e_phentsize, 0);
- elf_store_field_bitness(elf, header_handle, e_phnum, 0);
+ elf_store_field(elf, header_handle, e_phoff, 0);
+ elf_store_field(elf, header_handle, e_phentsize, 0);
+ elf_store_field(elf, header_handle, e_phnum, 0);
/* Zero the undefined section. */
section_handle = ELF_MAKE_HANDLE(elf_shdr,
@@ -354,10 +346,9 @@ do {
}
/* Adjust the sh_offset and sh_link of the copied section header. */
- elf_store_field_bitness(elf, section_handle, sh_offset,
- symtab_base - elf_header_base);
- elf_store_field_bitness(elf, section_handle, sh_link,
- STRTAB_INDEX);
+ elf_store_field(elf, section_handle, sh_offset,
+ symtab_base - elf_header_base);
+ elf_store_field(elf, section_handle, sh_link, STRTAB_INDEX);
/* Calculate the guest address where strtab is loaded. */
strtab_base = elf_round_up(elf, symtab_base +
@@ -387,8 +378,8 @@ do {
return;
}
- elf_store_field_bitness(elf, section_handle, sh_offset,
- strtab_base - elf_header_base);
+ elf_store_field(elf, section_handle, sh_offset,
+ strtab_base - elf_header_base);
/* Store the whole size (including headers and loaded sections). */
header.size = strtab_base + elf_uval(elf, section_handle, sh_size) -
@@ -409,7 +400,6 @@ do {
#undef SYMTAB_INDEX
#undef STRTAB_INDEX
-#undef elf_store_field_bitness
}
void elf_parse_binary(struct elf_binary *elf)
@@ -303,9 +303,13 @@ bool elf_access_ok(struct elf_binary * e
/* Stores a value at a particular PTRVAL. */
#define elf_store_field(elf, hdr, elm, val) \
- (elf_store_val((elf), ELF__HANDLE_FIELD_TYPE(hdr, elm), \
- ELF_HANDLE_PTRVAL(hdr) + ELF__HANDLE_FIELD_OFFSET(hdr, elm), \
- (val)))
+ ((ELFCLASS64 == (elf)->class) \
+ ? elf_store_val(elf, ELF__HANDLE_FIELD_TYPE(hdr, e64.elm), \
+ ELF_HANDLE_PTRVAL(hdr) + \
+ ELF__HANDLE_FIELD_OFFSET(hdr, e64.elm), val) \
+ : elf_store_val(elf, ELF__HANDLE_FIELD_TYPE(hdr, e32.elm), \
+ ELF_HANDLE_PTRVAL(hdr) + \
+ ELF__HANDLE_FIELD_OFFSET(hdr, e32.elm), val))
/* Stores a 32/64-bit field. hdr is a HANDLE and elm is the field name. */