Extract bin_write_elf.c common parts to bin_write_elf.inc

This commit is contained in:
Fangrui Song 2018-08-19 13:16:46 -07:00 committed by radare
parent e7de8b082f
commit 703ae306cc
4 changed files with 58 additions and 54 deletions

View File

@ -308,11 +308,18 @@ static RList* sections(RBinFile *bf) {
return ret;
}
static RBinAddr* newEntry(ut64 hpaddr, ut64 hvaddr, ut64 paddr, int type, int bits) {
RBinAddr *ptr = R_NEW0 (RBinAddr);
static RBinAddr* newEntry(RBinFile *bf, ut64 hpaddr, ut64 hvaddr, ut64 vaddr, int type, int bits) {
struct Elf_(r_bin_elf_obj_t)* obj;
RBinAddr *ptr;
if (!bf || !bf->o || !bf->o->bin_obj) {
return NULL;
}
obj = bf->o->bin_obj;
ptr = R_NEW0 (RBinAddr);
if (ptr) {
ptr->paddr = paddr;
ptr->vaddr = paddr;
ptr->paddr = Elf_(r_bin_elf_v2p) (obj, vaddr);
ptr->vaddr = vaddr;
ptr->hpaddr = hpaddr;
ptr->hvaddr = hvaddr;
ptr->bits = bits;
@ -350,7 +357,7 @@ static void process_constructors (RBinFile *bf, RList *ret, int bits) {
for (i = 0; (i + 3) < sec->size; i += 4) {
ut32 addr32 = r_read_le32 (buf + i);
if (addr32) {
RBinAddr *ba = newEntry (sec->paddr + i, sec->vaddr + i,
RBinAddr *ba = newEntry (bf, sec->paddr + i, sec->vaddr + i,
(ut64)addr32, type, bits);
r_list_append (ret, ba);
}
@ -359,7 +366,7 @@ static void process_constructors (RBinFile *bf, RList *ret, int bits) {
for (i = 0; (i + 7) < sec->size; i += 8) {
ut64 addr64 = r_read_le64 (buf + i);
if (addr64) {
RBinAddr *ba = newEntry (sec->paddr + i, sec->vaddr + i,
RBinAddr *ba = newEntry (bf, sec->paddr + i, sec->vaddr + i,
addr64, type, bits);
r_list_append (ret, ba);
}
@ -483,7 +490,7 @@ static RBinSymbol *convert_symbol(struct Elf_(r_bin_elf_obj_t) *bin,
if (!(ptr = R_NEW0 (RBinSymbol))) {
return NULL;
}
ptr->name = symbol->name[0] ? r_str_newf (namefmt, &symbol->name[0]) : strdup("");
ptr->name = symbol->name[0] ? r_str_newf (namefmt, &symbol->name[0]) : strdup ("");
ptr->forwarder = r_str_const ("NONE");
ptr->bind = r_str_const (symbol->bind);
ptr->type = r_str_const (symbol->type);
@ -550,18 +557,15 @@ static RList* symbols(RBinFile *bf) {
if (!symbol[i].size) {
continue;
}
ptr = convert_symbol (bin, &symbol[i], "imp.%s");
if (!ptr) {
break;
}
// special case where there is not entry in the plt for the import
if (ptr->vaddr == UT32_MAX) {
ptr->paddr = 0;
ptr->vaddr = 0;
}
insert_symbol (bin, ptr, symbol[i].is_sht_null, ret);
}
return ret;

View File

@ -1,50 +1,9 @@
/* radare - LGPL - Copyright 2009-2016 - pancake, nibble */
/* radare - LGPL - Copyright 2009-2018 - pancake, nibble */
#include "bin_write_elf.inc"
#include <r_types.h>
#include <r_bin.h>
#include "elf/elf.h"
static ut64 scn_resize(RBinFile *bf, const char *name, ut64 size) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_resize_section) (bf->o->bin_obj, name, size);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
static bool scn_perms(RBinFile *bf, const char *name, int perms) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_section_perms) (bf->o->bin_obj, name, perms);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
static int rpath_del(RBinFile *bf) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_del_rpath) (bf->o->bin_obj);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
static bool chentry(RBinFile *bf, ut64 addr) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_entry_write) (bf->o->bin_obj, addr);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
#if !R_BIN_ELF64
RBinWrite r_bin_write_elf = {
.scn_resize = &scn_resize,
.scn_perms = &scn_perms,
.rpath_del = &rpath_del,
.entry = &chentry,
};
#endif

View File

@ -0,0 +1,41 @@
/* radare - LGPL - Copyright 2009-2018 - pancake, nibble */
#include <r_types.h>
#include <r_bin.h>
#include "elf/elf.h"
static ut64 scn_resize(RBinFile *bf, const char *name, ut64 size) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_resize_section) (bf->o->bin_obj, name, size);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
static bool scn_perms(RBinFile *bf, const char *name, int perms) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_section_perms) (bf->o->bin_obj, name, perms);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
static int rpath_del(RBinFile *bf) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_del_rpath) (bf->o->bin_obj);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}
static bool chentry(RBinFile *bf, ut64 addr) {
struct Elf_(r_bin_elf_obj_t) *obj = bf->o->bin_obj;
int ret = Elf_(r_bin_elf_entry_write) (bf->o->bin_obj, addr);
r_buf_free (bf->buf);
bf->buf = obj->b;
obj->b = NULL;
return ret;
}

View File

@ -1,7 +1,7 @@
/* radare - LGPL - Copyright 2009-2016 pancake */
#define R_BIN_ELF64 1
#include "bin_write_elf.c"
#include "bin_write_elf.inc"
RBinWrite r_bin_write_elf64 = {
.scn_resize = &scn_resize,