On Fri, Sep 20, 2024 at 12:49:11AM -0700, Tony Ambardar wrote:
SNIP
+static int btfids_endian_fix(struct object *obj) +{
- Elf_Data *btfids = obj->efile.idlist;
- Elf *elf = obj->efile.elf;
- int file_byteorder;
- /* This should always succeed due to prior ELF checks */
- file_byteorder = elf_getident(elf, NULL)[EI_DATA];
- /* Set type to ensure endian translation occurs, and manually invoke
* translation on input since .BTF_ids section as created disables it.
*/
- btfids->d_type = ELF_T_WORD;
- if (gelf_xlatetom(elf, btfids, btfids, file_byteorder) == NULL) {
pr_err("FAILED xlatetom .BTF_ids data: %s\n", elf_errmsg(-1));
return -1;
- }
- return 0;
+}
static int elf_collect(struct object *obj) { Elf_Scn *scn = NULL; size_t shdrstrndx;
- GElf_Ehdr ehdr; int idx = 0; Elf *elf; int fd;
@@ -361,13 +371,6 @@ static int elf_collect(struct object *obj) return -1; }
- if (gelf_getehdr(obj->efile.elf, &ehdr) == NULL) {
pr_err("FAILED cannot get ELF header: %s\n",
elf_errmsg(-1));
return -1;
- }
- obj->efile.encoding = ehdr.e_ident[EI_DATA];
- /*
- Scan all the elf sections and look for save data
- from .BTF_ids section and symbols.
@@ -409,6 +412,8 @@ static int elf_collect(struct object *obj) obj->efile.idlist = data; obj->efile.idlist_shndx = idx; obj->efile.idlist_addr = sh.sh_addr;
if (btfids_endian_fix(obj))
return -1;
nit, it'd be bit more clear to me without using the btfids_endian_fix function and just unwind it in here.. but anyway lgtm
Acked-by: Jiri Olsa jolsa@kernel.org
jirka
} else if (!strcmp(name, BTF_BASE_ELF_SEC)) { /* If a .BTF.base section is found, do not resolve * BTF ids relative to vmlinux; resolve relative
@@ -706,24 +711,6 @@ static int sets_patch(struct object *obj) */ BUILD_BUG_ON((u32 *)set8->pairs != &set8->pairs[0].id); qsort(set8->pairs, set8->cnt, sizeof(set8->pairs[0]), cmp_id);
/*
* When ELF endianness does not match endianness of the
* host, libelf will do the translation when updating
* the ELF. This, however, corrupts SET8 flags which are
* already in the target endianness. So, let's bswap
* them to the host endianness and libelf will then
* correctly translate everything.
*/
if (obj->efile.encoding != ELFDATANATIVE) {
int i;
set8->flags = bswap_32(set8->flags);
for (i = 0; i < set8->cnt; i++) {
set8->pairs[i].flags =
bswap_32(set8->pairs[i].flags);
}
}}
pr_debug("sorting addr %5lu: cnt %6d [%s]\n", @@ -748,9 +735,6 @@ static int symbols_patch(struct object *obj) if (sets_patch(obj)) return -1;
- /* Set type to ensure endian translation occurs. */
- obj->efile.idlist->d_type = ELF_T_WORD;
- elf_flagdata(obj->efile.idlist, ELF_C_SET, ELF_F_DIRTY);
err = elf_update(obj->efile.elf, ELF_C_WRITE); -- 2.34.1