perf jit: Include program header in ELF files

The missing header makes it hard for programs like elfutils to open
these files.

Fixes: 2d86612aac ("perf symbol: Correct address for bss symbols")
Reviewed-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: Lieven Hey <lieven.hey@kdab.com>
Tested-by: Leo Yan <leo.yan@linaro.org>
Cc: Leo Yan <leo.yan@linaro.org>
Link: https://lore.kernel.org/r/20220915092910.711036-1-lieven.hey@kdab.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Lieven Hey 2022-09-15 11:29:10 +02:00 committed by Arnaldo Carvalho de Melo
parent 7901086014
commit babd04386b
2 changed files with 18 additions and 0 deletions

View File

@ -253,6 +253,7 @@ jit_write_elf(int fd, uint64_t load_addr, const char *sym,
Elf_Data *d; Elf_Data *d;
Elf_Scn *scn; Elf_Scn *scn;
Elf_Ehdr *ehdr; Elf_Ehdr *ehdr;
Elf_Phdr *phdr;
Elf_Shdr *shdr; Elf_Shdr *shdr;
uint64_t eh_frame_base_offset; uint64_t eh_frame_base_offset;
char *strsym = NULL; char *strsym = NULL;
@ -287,6 +288,19 @@ jit_write_elf(int fd, uint64_t load_addr, const char *sym,
ehdr->e_version = EV_CURRENT; ehdr->e_version = EV_CURRENT;
ehdr->e_shstrndx= unwinding ? 4 : 2; /* shdr index for section name */ ehdr->e_shstrndx= unwinding ? 4 : 2; /* shdr index for section name */
/*
* setup program header
*/
phdr = elf_newphdr(e, 1);
phdr[0].p_type = PT_LOAD;
phdr[0].p_offset = 0;
phdr[0].p_vaddr = 0;
phdr[0].p_paddr = 0;
phdr[0].p_filesz = csize;
phdr[0].p_memsz = csize;
phdr[0].p_flags = PF_X | PF_R;
phdr[0].p_align = 8;
/* /*
* setup text section * setup text section
*/ */

View File

@ -53,8 +53,10 @@ int jit_add_debug_info(Elf *e, uint64_t code_addr, void *debug, int nr_debug_ent
#if GEN_ELF_CLASS == ELFCLASS64 #if GEN_ELF_CLASS == ELFCLASS64
#define elf_newehdr elf64_newehdr #define elf_newehdr elf64_newehdr
#define elf_newphdr elf64_newphdr
#define elf_getshdr elf64_getshdr #define elf_getshdr elf64_getshdr
#define Elf_Ehdr Elf64_Ehdr #define Elf_Ehdr Elf64_Ehdr
#define Elf_Phdr Elf64_Phdr
#define Elf_Shdr Elf64_Shdr #define Elf_Shdr Elf64_Shdr
#define Elf_Sym Elf64_Sym #define Elf_Sym Elf64_Sym
#define ELF_ST_TYPE(a) ELF64_ST_TYPE(a) #define ELF_ST_TYPE(a) ELF64_ST_TYPE(a)
@ -62,8 +64,10 @@ int jit_add_debug_info(Elf *e, uint64_t code_addr, void *debug, int nr_debug_ent
#define ELF_ST_VIS(a) ELF64_ST_VISIBILITY(a) #define ELF_ST_VIS(a) ELF64_ST_VISIBILITY(a)
#else #else
#define elf_newehdr elf32_newehdr #define elf_newehdr elf32_newehdr
#define elf_newphdr elf32_newphdr
#define elf_getshdr elf32_getshdr #define elf_getshdr elf32_getshdr
#define Elf_Ehdr Elf32_Ehdr #define Elf_Ehdr Elf32_Ehdr
#define Elf_Phdr Elf32_Phdr
#define Elf_Shdr Elf32_Shdr #define Elf_Shdr Elf32_Shdr
#define Elf_Sym Elf32_Sym #define Elf_Sym Elf32_Sym
#define ELF_ST_TYPE(a) ELF32_ST_TYPE(a) #define ELF_ST_TYPE(a) ELF32_ST_TYPE(a)