mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-26 09:06:02 +00:00
Extract bin_write_elf.c common parts to bin_write_elf.inc
This commit is contained in:
parent
e7de8b082f
commit
703ae306cc
@ -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;
|
||||
|
@ -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
|
||||
|
41
libr/bin/p/bin_write_elf.inc
Normal file
41
libr/bin/p/bin_write_elf.inc
Normal 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;
|
||||
}
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user