btf_encoder: Move ELF's ehdr from btf_elf to btf_encoder
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
b3701a8346
commit
aa48ed55a7
|
@ -29,6 +29,16 @@
|
|||
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* This depends on the GNU extension to eliminate the stray comma in the zero
|
||||
* arguments case.
|
||||
*
|
||||
* The difference between elf_errmsg(-1) and elf_errmsg(elf_errno()) is that the
|
||||
* latter clears the current error.
|
||||
*/
|
||||
#define elf_error(fmt, ...) \
|
||||
fprintf(stderr, "%s: " fmt ": %s.\n", __func__, ##__VA_ARGS__, elf_errmsg(-1))
|
||||
|
||||
/*
|
||||
* This corresponds to the same macro defined in
|
||||
* include/linux/kallsyms.h
|
||||
|
@ -463,7 +473,25 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, struct btf *base_btf, bool s
|
|||
encoder->need_index_type = false;
|
||||
encoder->array_index_id = 0;
|
||||
|
||||
encoder->symtab = elf_symtab__new(NULL, cu->elf, &encoder->btfe->ehdr);
|
||||
if (gelf_getehdr(cu->elf, &encoder->ehdr) == NULL) {
|
||||
if (encoder->verbose)
|
||||
elf_error("cannot get ELF header");
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
switch (encoder->ehdr.e_ident[EI_DATA]) {
|
||||
case ELFDATA2LSB:
|
||||
btf__set_endianness(encoder->btfe->btf, BTF_LITTLE_ENDIAN);
|
||||
break;
|
||||
case ELFDATA2MSB:
|
||||
btf__set_endianness(encoder->btfe->btf, BTF_BIG_ENDIAN);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "%s: unknown ELF endianness.\n", __func__);
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
encoder->symtab = elf_symtab__new(NULL, cu->elf, &encoder->ehdr);
|
||||
if (!encoder->symtab) {
|
||||
if (encoder->verbose)
|
||||
printf("%s: '%s' doesn't have symtab.\n", __func__, encoder->btfe->filename);
|
||||
|
@ -473,7 +501,7 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, struct btf *base_btf, bool s
|
|||
/* find percpu section's shndx */
|
||||
|
||||
GElf_Shdr shdr;
|
||||
Elf_Scn *sec = elf_section_by_name(cu->elf, &encoder->btfe->ehdr, &shdr, PERCPU_SECTION, NULL);
|
||||
Elf_Scn *sec = elf_section_by_name(cu->elf, &encoder->ehdr, &shdr, PERCPU_SECTION, NULL);
|
||||
|
||||
if (!sec) {
|
||||
if (encoder->verbose)
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <gelf.h>
|
||||
|
||||
struct btf;
|
||||
struct btf_elf;
|
||||
|
@ -28,6 +29,7 @@ struct var_info {
|
|||
struct btf_encoder {
|
||||
struct btf_elf *btfe;
|
||||
struct elf_symtab *symtab;
|
||||
GElf_Ehdr ehdr;
|
||||
bool has_index_type,
|
||||
need_index_type,
|
||||
verbose;
|
||||
|
|
18
libbtf.c
18
libbtf.c
|
@ -86,24 +86,6 @@ struct btf_elf *btf_elf__new(const char *filename, Elf *elf, struct btf *base_bt
|
|||
}
|
||||
}
|
||||
|
||||
if (gelf_getehdr(btfe->elf, &btfe->ehdr) == NULL) {
|
||||
if (btf_elf__verbose)
|
||||
elf_error("cannot get ELF header");
|
||||
goto errout;
|
||||
}
|
||||
|
||||
switch (btfe->ehdr.e_ident[EI_DATA]) {
|
||||
case ELFDATA2LSB:
|
||||
btf__set_endianness(btfe->btf, BTF_LITTLE_ENDIAN);
|
||||
break;
|
||||
case ELFDATA2MSB:
|
||||
btf__set_endianness(btfe->btf, BTF_BIG_ENDIAN);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "%s: unknown ELF endianness.\n", __func__);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
return btfe;
|
||||
|
||||
errout:
|
||||
|
|
Loading…
Reference in New Issue