Instead of elf_load_bsdsyms() cooking its own variant, let's just make the generic thing cope with different bitness (paralleling elf_uval() and alike). --- a/xen/common/libelf/libelf-loader.c +++ b/xen/common/libelf/libelf-loader.c @@ -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) --- a/xen/include/xen/libelf.h +++ b/xen/include/xen/libelf.h @@ -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. */