10 "PT_INTERP=3,PT_NOTE=4,PT_SHLIB=5,PT_PHDR=6,PT_LOOS=0x60000000,"
11 "PT_HIOS=0x6fffffff,PT_LOPROC=0x70000000,PT_HIPROC=0x7fffffff};";
14 "PF_Write=2,PF_Write_Exec=3,PF_Read=4,PF_Read_Exec=5,PF_Read_Write=6,"
15 "PF_Read_Write_Exec=7};";
18 " ET_EXEC=2, ET_DYN=3, ET_CORE=4, ET_LOOS=0xfe00, ET_HIOS=0xfeff,"
19 " ET_LOPROC=0xff00, ET_HIPROC=0xffff };";
22 " EM_SPARC=2, EM_386=3, EM_68K=4, EM_88K=5, EM_IAMCU=6, EM_860=7, EM_MIPS=8,"
23 " EM_S370=9, EM_MIPS_RS3_LE=10, EM_RS6000=11, EM_PARISC=15, EM_nCUBE=16,"
24 " EM_VPP500=17, EM_SPARC32PLUS=18, EM_960=19, EM_PPC=20, EM_PPC64=21, EM_S390=22,"
25 " EM_SPU=23, EM_V800=36, EM_FR20=37, EM_RH32=38, EM_RCE=39, EM_ARM=40,"
26 " EM_ALPHA=41, EM_SH=42, EM_SPARCV9=43, EM_TRICORE=44, EM_ARC=45, EM_H8_300=46,"
27 " EM_H8_300H=47, EM_H8S=48, EM_H8_500=49, EM_IA_64=50, EM_MIPS_X=51,"
28 " EM_COLDFIRE=52, EM_68HC12=53, EM_MMA=54, EM_PCP=55, EM_NCPU=56, EM_NDR1=57,"
29 " EM_STARCORE=58, EM_ME16=59, EM_ST100=60, EM_TINYJ=61, EM_X86_64=62, EM_PDSP=63,"
30 " EM_PDP10=64, EM_PDP11=65, EM_FX66=66, EM_ST9PLUS=67, EM_ST7=68, EM_68HC16=69,"
31 " EM_68HC11=70, EM_68HC08=71, EM_68HC05=72, EM_SVX=73, EM_ST19=74, EM_VAX=75,"
32 " EM_CRIS=76, EM_JAVELIN=77, EM_FIREPATH=78, EM_ZSP=79, EM_MMIX=80, EM_HUANY=81,"
33 " EM_PRISM=82, EM_AVR=83, EM_FR30=84, EM_D10V=85, EM_D30V=86, EM_V850=87,"
34 " EM_M32R=88, EM_MN10300=89, EM_MN10200=90, EM_PJ=91, EM_OPENRISC=92,"
35 " EM_ARC_COMPACT=93, EM_XTENSA=94, EM_VIDEOCORE=95, EM_TMM_GPP=96, EM_NS32K=97,"
36 " EM_TPC=98, EM_SNP1K=99, EM_ST200=100, EM_IP2K=101, EM_MAX=102, EM_CR=103,"
37 " EM_F2MC16=104, EM_MSP430=105, EM_BLACKFIN=106, EM_SE_C33=107, EM_SEP=108,"
38 " EM_ARCA=109, EM_UNICORE=110, EM_EXCESS=111, EM_DXP=112, EM_ALTERA_NIOS2=113,"
39 " EM_CRX=114, EM_XGATE=115, EM_C166=116, EM_M16C=117, EM_DSPIC30F=118, EM_CE=119,"
40 " EM_M32C=120, EM_TSK3000=131, EM_RS08=132, EM_SHARC=133, EM_ECOG2=134,"
41 " EM_SCORE7=135, EM_DSP24=136, EM_VIDEOCORE3=137, EM_LATTICEMICO32=138,"
42 " EM_SE_C17=139, EM_TI_C6000=140, EM_TI_C2000=141, EM_TI_C5500=142,"
43 " EM_TI_ARP32=143, EM_TI_PRU=144,"
44 " EM_MMDSP_PLUS=160, EM_CYPRESS_M8C=161, EM_R32C=162, EM_TRIMEDIA=163,"
45 " EM_QDSP6=164, EM_8051=165, EM_STXP7X=166, EM_NDS32=167,"
46 " EM_ECOG1X=168, EM_MAXQ30=169, EM_XIMO16=170, EM_MANIK=171, EM_CRAYNV2=172,"
47 " EM_RX=173, EM_METAG=174, EM_MCST_ELBRUS=175, EM_ECOG16=176, EM_CR16=177,"
48 " EM_ETPU=178, EM_SLE9X=179, EM_L10M=180, EM_K10M=181, EM_AARCH64=183,"
49 " EM_AVR32=185, EM_STM8=186, EM_TILE64=187, EM_TILEPRO=188, EM_CUDA=190,"
50 " EM_TILEGX=191, EM_CLOUDSHIELD=192, EM_COREA_1ST=193, EM_COREA_2ND=194,"
51 " EM_ARC_COMPACT2=195, EM_OPEN8=196, EM_RL78=197, EM_VIDEOCORE5=198,"
52 " EM_78KOR=199, EM_56800EX=200, EM_BA1=201, EM_BA2=202, EM_XCORE=203,"
53 " EM_MCHP_PIC=204, EM_INTEL205=205, EM_INTEL206=206, EM_INTEL207=207,"
54 " EM_INTEL208=208, EM_INTEL209=209, EM_KM32=210, EM_KMX32=211, EM_KMX16=212,"
55 " EM_KMX8=213, EM_KVARC=214, EM_CDP=215, EM_COGE=216, EM_COOL=217, EM_NORC=218,"
56 " EM_CSR_KALIMBA=219, EM_AMDGPU=224, EM_RISCV=243, EM_LANAI=244, EM_BPF=247,"
57 " EM_CSKY=252, EM_KVX=256}";
61 static const char *
sdb_elf_data_cparse =
"enum elf_data {ELFDATANONE=0, ELFDATA2LSB=1, ELFDATA2MSB=2};";
68 " magic (elf_class)class (elf_data)data (elf_hdr_version)version";
71 "SHT_SYMTAB=2,SHT_STRTAB=3,SHT_RELA=4,SHT_HASH=5,SHT_DYNAMIC=6,SHT_NOTE=7,"
72 "SHT_NOBITS=8,SHT_REL=9,SHT_SHLIB=10,SHT_DYNSYM=11,SHT_LOOS=0x60000000,"
73 "SHT_HIOS=0x6fffffff,SHT_LOPROC=0x70000000,SHT_HIPROC=0x7fffffff};";
76 static const char *
sdb_elf_phdr_format =
"[4]E[4]Eqqqqqq (elf_p_type)type (elf_p_flags)flags"
77 " offset vaddr paddr filesz memsz align";
79 static const char *sdb_elf_s_flags_64_cparse =
"enum elf_s_flags_64 {SF64_None=0,SF64_Exec=1,"
80 "SF64_Alloc=2,SF64_Alloc_Exec=3,SF64_Write=4,SF64_Write_Exec=5,"
81 "SF64_Write_Alloc=6,SF64_Write_Alloc_Exec=7};";
84 " (elf_s_flags_64)flags addr offset size link info addralign entsize";
87 " (elf_ident)ident (elf_type)type (elf_machine)machine (elf_obj_version)version"
88 " entry phoff shoff flags ehsize phentsize phnum shentsize shnum shstrndx";
91 " filesz memsz (elf_p_flags)flags align";
94 "SF32_Alloc=2,SF32_Alloc_Exec=3,SF32_Write=4,SF32_Write_Exec=5,"
95 "SF32_Write_Alloc=6,SF32_Write_Alloc_Exec=7};";
98 " (elf_s_flags_32)flags addr offset size link info addralign entsize";
101 " (elf_ident)ident (elf_type)type (elf_machine)machine (elf_obj_version)version"
102 " entry phoff shoff flags ehsize phentsize phnum shentsize shnum shstrndx";
106 return addr >= segment->data.p_vaddr &&
addr < segment->data.p_vaddr + segment->data.p_filesz;
110 return addr >= segment->data.p_offset &&
addr < segment->data.p_offset + segment->data.p_filesz;
123 if (!
bin->segments) {
131 if (!
bin->ehdr.e_phnum) {
137 RZ_LOG_WARN(
"Failed to initialize program header.\n");
166 sdb_set(
bin->kv,
"elf_s_flags_64.cparse", sdb_elf_s_flags_64_cparse, 0) &&
176 if (!
bin->sections) {
185 RZ_LOG_WARN(
"Failed to initialize section header.\n");
201 RZ_LOG_WARN(
"Invalid ELF header e_shstrndx value.\n");
206 if (!
bin->shstrtab) {
215 RZ_LOG_WARN(
"Failed to initialize section string table.\n");
222 return sdb_set(
bin->kv,
"elf.relro",
"full", 0);
224 return sdb_set(
bin->kv,
"elf.relro",
"partial", 0);
226 return sdb_set(
bin->kv,
"elf.relro",
"no", 0);
234 if (!
bin->dt_dynamic) {
243 RZ_LOG_INFO(
"Failed to initialize ELF DT_DYNAMIC.\n");
248 return sdb_num_set(
bin->kv,
"elf_dynstr.offset", strtab_addr, 0) &&
257 RZ_LOG_INFO(
"DT_STRTAB or DT_STRSZ key not found.\n");
263 RZ_LOG_INFO(
"Failed to convert DT_STRTAB to a physical offset.\n");
277 RZ_LOG_INFO(
"Failed to initialize string table for dynamic linking.\n");
292 RZ_LOG_INFO(
"Failed to initialize GNU symbols information.\n")
303 if (
options->elf_load_sections) {
405 return bin->baddr + paddr;
414 return segment->data.p_vaddr + paddr - segment->data.p_offset;
434 return vaddr -
bin->baddr;
443 return segment->data.p_offset + vaddr - segment->data.p_vaddr;
RzBinInfo * info(RzBinFile *bf)
RzList * sections(RzBinFile *bf)
static void init_phdr(ELFOBJ *bin, RzVector *sections, RzBinObjectLoadOptions *options)
static void init_shdr(ELFOBJ *bin, RzBinObjectLoadOptions *options, RzVector *sections)
static bool init_ehdr_sdb(ELFOBJ *bin)
static void init_dynstr(ELFOBJ *bin)
static bool init_phdr_sdb(ELFOBJ *bin)
static bool init_dt_dynamic_aux(ELFOBJ *bin)
static const char * sdb_elf_s_flags_32_cparse
ut64 Elf_() rz_bin_elf_p2v(RZ_NONNULL ELFOBJ *bin, ut64 paddr)
Convert a physical address to the virtual address.
static const char * sdb_elf_ident_format
static bool init_ehdr(ELFOBJ *bin)
static bool init(ELFOBJ *bin, RzBinObjectLoadOptions *options)
static const char * sdb_elf_header_format
static bool init_shdr_sdb(ELFOBJ *bin)
static void init_shstrtab(ELFOBJ *bin, RzVector *sections)
static bool init_shstrtab_aux(ELFOBJ *bin, RzVector *sections)
static bool init_dt_dynamic_sdb(ELFOBJ *bin)
static bool init_shdr_aux(ELFOBJ *bin, RzBinObjectLoadOptions *options, RzVector *sections)
static bool init_dynstr_sdb(ELFOBJ *bin, ut64 strtab_addr, Elf_(Xword) strtab_size)
static const char * sdb_elf_phdr_format
static const char * sdb_elf_data_cparse
static const char * sdb_elf_p_type_cparse
void Elf_() rz_bin_elf_free(RZ_NONNULL ELFOBJ *bin)
Free the elf binary.
static bool init_symbols_info_aux(ELFOBJ *bin)
static void init_dt_dynamic(ELFOBJ *bin)
static bool init_dynstr_aux(ELFOBJ *bin)
static const char * sdb_elf_shdr_format
static const char * sdb_elf_hdr_version_cparse
RZ_OWN ELFOBJ *Elf_() rz_bin_elf_new_buf(RZ_NONNULL RzBuffer *buf, RZ_NONNULL RzBinObjectLoadOptions *options)
static bool init_phdr_aux(ELFOBJ *bin, RzVector *sections, RzBinObjectLoadOptions *options)
static const char * sdb_elf_machine_cparse
static const char * sdb_elf_p_flags_cparse
static bool in_virtual_phdr(RzBinElfSegment *segment, ut64 addr)
static const char * sdb_elf_type_cparse
static void init_symbols_info(ELFOBJ *bin)
static bool in_physical_phdr(RzBinElfSegment *segment, ut64 addr)
static const char * sdb_elf_obj_version_cparse
static const char * sdb_elf_class_cparse
static bool init_shstrtab_sdb(ELFOBJ *bin, ut64 offset, ut64 size)
ut64 Elf_() rz_bin_elf_v2p(RZ_NONNULL ELFOBJ *bin, ut64 vaddr)
Convert a virtual address to the physical address.
static const char * sdb_elf_s_type_cparse
RZ_OWN RzVector *Elf_() rz_bin_elf_relocs_new(RZ_NONNULL ELFOBJ *bin)
#define rz_bin_elf_foreach_segments(bin, segment)
RZ_OWN Sdb *Elf_() rz_bin_elf_get_symbols_info(RZ_NONNULL ELFOBJ *bin)
bool Elf_() rz_bin_elf_get_ehdr(RZ_NONNULL ELFOBJ *bin)
bool Elf_() rz_bin_elf_is_static(RZ_NONNULL ELFOBJ *bin)
Check if the binary is statically-linked library.
#define RZ_BIN_ELF_FULL_RELRO
void Elf_() rz_bin_elf_dt_dynamic_free(RzBinElfDtDynamic *ptr)
RZ_OWN RzBinElfDtDynamic *Elf_() rz_bin_elf_dt_dynamic_new(RZ_NONNULL ELFOBJ *bin)
ut64 Elf_() rz_bin_elf_get_baddr(RZ_NONNULL ELFOBJ *bin)
Compute the base address of the binary.
RZ_OWN RzVector *Elf_() rz_bin_elf_symbols_new(RZ_NONNULL ELFOBJ *bin)
ut64 Elf_() rz_bin_elf_get_targets_map_base(ELFOBJ *bin)
RZ_OWN RzVector *Elf_() rz_bin_elf_sections_new(RZ_NONNULL ELFOBJ *bin)
RZ_OWN RzBinElfStrtab *Elf_() rz_bin_elf_strtab_new(RZ_NONNULL ELFOBJ *bin, ut64 offset, ut64 size)
void Elf_() rz_bin_elf_strtab_free(RzBinElfStrtab *ptr)
bool Elf_() rz_bin_elf_get_dt_info(RZ_NONNULL ELFOBJ *bin, ut64 key, RZ_OUT ut64 *info)
RZ_OWN RzVector *Elf_() rz_bin_elf_segments_new(RZ_NONNULL ELFOBJ *bin, RzVector *sections, RZ_NONNULL RzBinObjectLoadOptions *options)
#define RZ_BIN_ELF_PART_RELRO
RZ_OWN RzVector *Elf_() rz_bin_elf_analyse_imports(RZ_NONNULL ELFOBJ *bin)
int Elf_() rz_bin_elf_get_bits(RZ_NONNULL ELFOBJ *bin)
Return the elf bits.
RZ_OWN RzVector *Elf_() rz_bin_elf_notes_new(RZ_NONNULL ELFOBJ *bin)
RZ_OWN RzVector *Elf_() rz_bin_elf_convert_sections(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RzBinObjectLoadOptions *options, RzVector *sections)
bool Elf_() rz_bin_elf_has_segments(RZ_NONNULL ELFOBJ *bin)
bool Elf_() rz_bin_elf_is_relocatable(RZ_NONNULL ELFOBJ *bin)
Check if the elf binary is relocatable.
ut64 Elf_() rz_bin_elf_get_boffset(RZ_NONNULL ELFOBJ *bin)
Compute the base offset of the binary.
int Elf_() rz_bin_elf_has_relro(RZ_NONNULL ELFOBJ *bin)
Analyse if the elf binary has relro or partial relro.
RZ_API void Ht_() free(HtName_(Ht) *ht)
static const char struct stat static buf struct stat static buf static vhangup int options
RZ_API int sdb_ns_set(Sdb *s, const char *name, Sdb *r)
RZ_API int sdb_num_set(Sdb *s, const char *key, ut64 v, ut32 cas)
#define rz_return_if_fail(expr)
#define rz_return_val_if_fail(expr, val)
RZ_API RzBuffer * rz_buf_ref(RzBuffer *b)
Increment the reference count of the buffer.
RZ_API void rz_buf_free(RzBuffer *b)
Free all internal data hold by the buffer and the buffer.
RZ_API ut64 rz_buf_size(RZ_NONNULL RzBuffer *b)
Return the size of the buffer.
#define RZ_LOG_INFO(fmtstr,...)
#define RZ_LOG_WARN(fmtstr,...)
static void * rz_vector_index_ptr(RzVector *vec, size_t index)
RZ_API void rz_vector_free(RzVector *vec)
RZ_API int sdb_set(Sdb *s, const char *key, const char *val, ut32 cas)
RZ_API Sdb * sdb_new0(void)
RZ_API bool sdb_free(Sdb *s)
ut64(WINAPI *w32_GetEnabledXStateFeatures)()