Skip to content

Commit c59f051

Browse files
committed
Port to v9
1 parent 11679e5 commit c59f051

File tree

11 files changed

+88
-86
lines changed

11 files changed

+88
-86
lines changed

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CXX ?= g++
2-
CXXFLAGS=-m32 -fPIC -shared -Wall -Wextra -std=c++11
2+
CXXFLAGS=-fPIC -shared -Wall -Wextra -std=c++11
33
LDFLAGS+=-static-libgcc -static-libstdc++
4-
LIBS=-lida lib/libelf32.a lib/libdwarf32.a
5-
INCLUDES=-I$(IDASDK_PATH)/include -I$(IDA_PATH)/plugins/hexrays_sdk/include
4+
LIBS=-lida -ldwarf
5+
INCLUDES=-isystem $(IDASDK_PATH)/include -I$(IDA_PATH)/plugins/hexrays_sdk/include
66

77
DWARFEXPORT_SRC = $(wildcard src/*.cpp)
88

bin/dwarfexport.p64

-2.87 MB
Binary file not shown.

bin/dwarfexport.plw

-2.87 MB
Binary file not shown.

bin/dwarfexport.pmc

-648 KB
Binary file not shown.

bin/dwarfexport.pmc64

-648 KB
Binary file not shown.

lib/libdwarf32.a

-625 KB
Binary file not shown.

lib/libelf32.a

-221 KB
Binary file not shown.

src/dwarfexport.cpp

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include <range.hpp>
1212
#include <segment.hpp>
1313
#include <string>
14-
#include <struct.hpp>
1514

1615
#include "dwarfexport.h"
1716

@@ -73,9 +72,9 @@ static Dwarf_P_Die add_struct_type(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
7372
dwarfexport_log(" Member Count = ", member_count);
7473

7574
for (int i = 0; i < member_count; ++i) {
76-
udt_member_t member;
75+
udm_t member;
7776
member.offset = i;
78-
type.find_udt_member(&member, STRMEM_INDEX);
77+
type.get_udm(&member, STRMEM_INDEX);
7978
auto member_type = member.type;
8079
auto member_die =
8180
dwarf_new_die(dbg, DW_TAG_member, die, NULL, NULL, NULL, &err);
@@ -98,7 +97,7 @@ static Dwarf_P_Die add_struct_type(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
9897
// Add member location in struct
9998
Dwarf_P_Expr loc_expr = dwarf_new_expr(dbg, &err);
10099
if (dwarf_add_expr_gen(loc_expr, DW_OP_plus_uconst, member.offset / 8, 0,
101-
&err) == DW_DLV_NOCOUNT) {
100+
&err) == (Dwarf_Unsigned)DW_DLV_NOCOUNT) {
102101
dwarfexport_error("dwarf_add_expr_gen failed: ", dwarf_errmsg(err));
103102
}
104103

@@ -331,7 +330,7 @@ static Dwarf_P_Die add_variable(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
331330

332331
Dwarf_P_Expr loc_expr = dwarf_new_expr(dbg, &err);
333332
if (dwarf_add_expr_gen(loc_expr, DW_OP_regx, reg_num, 0, &err) ==
334-
DW_DLV_NOCOUNT) {
333+
(Dwarf_Unsigned)DW_DLV_NOCOUNT) {
335334
dwarfexport_error("dwarf_add_expr_gen failed: ", dwarf_errmsg(err));
336335
}
337336
if (dwarf_add_AT_location_expr(dbg, die, DW_AT_location, loc_expr,
@@ -357,46 +356,45 @@ static void add_disassembler_func_info(std::shared_ptr<DwarfGenInfo> info,
357356
auto dbg = info->dbg;
358357
Dwarf_Error err = 0;
359358

360-
auto frame = get_frame(func);
361-
if (frame == nullptr) {
359+
tinfo_t frame;
360+
if (!frame.get_func_frame(func)) {
361+
return;
362+
}
363+
udt_type_data_t frame_details;
364+
if (!frame.get_udt_details(&frame_details)) {
362365
return;
363366
}
364367

365-
for (std::size_t i = 0; i < frame->memqty; ++i) {
366-
auto name = get_member_name(frame->members[i].id);
368+
for (std::size_t i = 0; i < frame_details.size(); ++i) {
369+
udm_t *member = &frame_details[i];
370+
qstring *name = &member->name;
367371

368372
// Ignore these special 'variables'
369-
if (name == " s" || name == " r") {
373+
if (*name == " s" || *name == " r") {
370374
continue;
371375
}
372376

373-
dwarfexport_log("Adding local variable: ", &name[0]);
377+
dwarfexport_log("Adding local variable: ", name->c_str());
374378

375379
Dwarf_P_Die die;
376380
die = dwarf_new_die(dbg, DW_TAG_variable, func_die, NULL, NULL, NULL, &err);
377381

378-
if (dwarf_add_AT_name(die, &name[0], &err) == NULL) {
382+
if (dwarf_add_AT_name(die, (char *)name->c_str(), &err) == NULL) {
379383
dwarfexport_error("dwarf_add_AT_name failed: ", dwarf_errmsg(err));
380384
}
381385

382386
auto loc_expr =
383-
disassembler_stack_lvar_location(dbg, func, &frame->members[i]);
387+
disassembler_stack_lvar_location(dbg, func, member);
384388

385389
if (loc_expr == nullptr) {
386390
continue;
387391
}
388392

389-
auto member_struct = get_sptr(&frame->members[i]);
390-
if (member_struct) {
391-
tinfo_t type;
392-
if (guess_tinfo(&type, member_struct->id) == GUESS_FUNC_OK) {
393-
auto var_type_die = get_or_add_type(dbg, cu, type, record);
394-
if (dwarf_add_AT_reference(dbg, die, DW_AT_type, var_type_die, &err) ==
395-
nullptr) {
396-
dwarfexport_error("dwarf_add_AT_reference failed: ",
397-
dwarf_errmsg(err));
398-
}
399-
}
393+
auto var_type_die = get_or_add_type(dbg, cu, member->type, record);
394+
if (dwarf_add_AT_reference(dbg, die, DW_AT_type, var_type_die, &err) ==
395+
nullptr) {
396+
dwarfexport_error("dwarf_add_AT_reference failed: ",
397+
dwarf_errmsg(err));
400398
}
401399

402400
if (dwarf_add_AT_location_expr(dbg, die, DW_AT_location, loc_expr, &err) ==
@@ -418,14 +416,12 @@ static void add_disassembler_func_info(std::shared_ptr<DwarfGenInfo> info,
418416
* @param file An output file stream used for storing the decompiled source
419417
* @param linecount The current number of lines in 'file'
420418
* @param file_index The dwarf file index associated with 'cu'
421-
* @param symbol_index The symbol index associated with the function (unused)
422419
* @param record The type record to update when adding variable types
423420
*/
424421
static void add_decompiler_func_info(std::shared_ptr<DwarfGenInfo> info,
425422
Dwarf_P_Die cu, Dwarf_P_Die func_die,
426423
func_t *func, std::ostream &file,
427424
int &linecount, Dwarf_Unsigned file_index,
428-
Dwarf_Unsigned symbol_index,
429425
type_record_t &record) {
430426
auto dbg = info->dbg;
431427
auto err = info->err;
@@ -562,7 +558,7 @@ static Dwarf_P_Die add_function(std::shared_ptr<DwarfGenInfo> info,
562558
// TODO: what to do for non-bp based frames
563559
Dwarf_P_Expr loc_expr = dwarf_new_expr(dbg, &err);
564560
if (dwarf_add_expr_gen(loc_expr, DW_OP_call_frame_cfa, 0, 0, &err) ==
565-
DW_DLV_NOCOUNT) {
561+
(Dwarf_Unsigned)DW_DLV_NOCOUNT) {
566562
dwarfexport_error("dwarf_add_expr_gen failed: ", dwarf_errmsg(err));
567563
}
568564
if (dwarf_add_AT_location_expr(dbg, die, DW_AT_frame_base, loc_expr, &err) ==
@@ -615,7 +611,7 @@ static Dwarf_P_Die add_function(std::shared_ptr<DwarfGenInfo> info,
615611
false, &err);
616612

617613
add_decompiler_func_info(info, cu, die, func, file, linecount, file_index,
618-
0, record);
614+
record);
619615
} else {
620616
add_disassembler_func_info(info, cu, die, func, record);
621617
}
@@ -630,12 +626,10 @@ static Dwarf_P_Die add_function(std::shared_ptr<DwarfGenInfo> info,
630626
*/
631627
void add_structures(Dwarf_P_Debug dbg, Dwarf_P_Die cu, type_record_t &record) {
632628
dwarfexport_log("Adding unused types");
633-
for (auto idx = get_first_struc_idx(); idx != BADADDR;
634-
idx = get_next_struc_idx(idx)) {
635-
auto tid = get_struc_by_idx(idx);
629+
uint32 limit = get_ordinal_limit();
630+
for (uint32 i = 1; i < limit; ++i) {
636631
tinfo_t type;
637-
638-
if (guess_tinfo(&type, tid) == GUESS_FUNC_OK) {
632+
if (type.get_numbered_type(i)) {
639633
get_or_add_type(dbg, cu, type, record);
640634
}
641635
}
@@ -690,7 +684,8 @@ void add_global_variables(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
690684

691685
// FIXME: this won't work in shared libs
692686
Dwarf_P_Expr loc_expr = dwarf_new_expr(dbg, &err);
693-
if (dwarf_add_expr_addr_b(loc_expr, addr, 0, &err) == DW_DLV_NOCOUNT) {
687+
if (dwarf_add_expr_addr_b(loc_expr, addr, 0, &err) ==
688+
(Dwarf_Unsigned)DW_DLV_NOCOUNT) {
694689
dwarfexport_error("dwarf_add_expr_gen failed: ", dwarf_errmsg(err));
695690
}
696691
if (dwarf_add_AT_location_expr(dbg, die, DW_AT_location, loc_expr,
@@ -729,7 +724,7 @@ void add_debug_info(std::shared_ptr<DwarfGenInfo> info,
729724

730725
int linecount = 1;
731726
type_record_t record;
732-
auto seg_qty = get_segm_qty();
727+
std::size_t seg_qty = get_segm_qty();
733728
for (std::size_t segn = 0; segn < seg_qty; ++segn) {
734729
auto seg = getnseg(segn);
735730
if (seg == nullptr) {
@@ -781,7 +776,7 @@ void add_debug_info(std::shared_ptr<DwarfGenInfo> info,
781776
add_structures(dbg, cu, record);
782777
}
783778

784-
int idaapi init(void) {
779+
static plugmod_t *idaapi init(void) {
785780
if (init_hexrays_plugin()) {
786781
msg("dwarfexport: Using decompiler\n");
787782
has_decompiler = true;
@@ -847,8 +842,7 @@ bool idaapi run(size_t) {
847842
write_dwarf_file(info, options);
848843
}
849844
} catch (const std::exception &e) {
850-
std::string msg = "A dwarfexport error occurred: " + std::string(e.what());
851-
warning(msg.c_str());
845+
warning("A dwarfexport error occurred: %s", e.what());
852846
} catch (...) {
853847
warning("A dwarfexport error occurred");
854848
}

src/dwarfexport.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <fstream>
66
#include <hexrays.hpp>
77
#include <iostream>
8-
#include <libdwarf.h>
8+
#include <libdwarf/libdwarf.h>
99
#include <memory>
1010
#include <sstream>
1111
#include <stdexcept>
@@ -85,7 +85,7 @@ int translate_register_num(int ida_reg_num);
8585
Dwarf_P_Expr decompiler_stack_lvar_location(Dwarf_P_Debug dbg, cfuncptr_t cfunc,
8686
const lvar_t &var);
8787
Dwarf_P_Expr disassembler_stack_lvar_location(Dwarf_P_Debug dbg, func_t *func,
88-
member_t *member);
88+
udm_t *member);
8989

9090
#ifdef __NT__
9191
#define PATH_SEP '\\'

src/dwarfgen.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ static int add_section_header_string(Elf *elf, const char *name) {
1818
static strtabdata strtab;
1919

2020
std::size_t sh_index;
21-
if (elf_getshstrndx(elf, &sh_index) == -1) {
21+
if (elf_getshdrstrndx(elf, &sh_index) == -1) {
2222
dwarfexport_error("elf_getshstrndx() failed: ", elf_errmsg(-1));
2323
}
2424

@@ -51,10 +51,10 @@ static int add_section_header_string(Elf *elf, const char *name) {
5151
return ret;
5252
}
5353

54-
static int attached_info_callback(const char *name, int size,
54+
static int attached_info_callback(const char *name, int /* size */,
5555
Dwarf_Unsigned type, Dwarf_Unsigned flags,
5656
Dwarf_Unsigned link, Dwarf_Unsigned info,
57-
Dwarf_Unsigned *sect_name_symbol_index,
57+
Dwarf_Unsigned */* sect_name_symbol_index */,
5858
void *userdata, int *) {
5959
DwarfGenInfo &geninfo = *(DwarfGenInfo *)userdata;
6060
auto elf = geninfo.elf;
@@ -94,11 +94,13 @@ static int attached_info_callback(const char *name, int size,
9494
}
9595

9696
static std::vector<std::string> detached_sections;
97-
static int detached_info_callback(const char *name, int size,
98-
Dwarf_Unsigned type, Dwarf_Unsigned flags,
99-
Dwarf_Unsigned link, Dwarf_Unsigned info,
100-
Dwarf_Unsigned *sect_name_symbol_index,
101-
void *userdata, int *) {
97+
static int detached_info_callback(const char *name, int /* size */,
98+
Dwarf_Unsigned /* type */,
99+
Dwarf_Unsigned /* flags */,
100+
Dwarf_Unsigned /* link */,
101+
Dwarf_Unsigned /* info */,
102+
Dwarf_Unsigned */* sect_name_symbol_index */,
103+
void */* userdata */, int *) {
102104
detached_sections.push_back(name);
103105
return detached_sections.size() - 1;
104106
}
@@ -118,7 +120,7 @@ std::shared_ptr<DwarfGenInfo> generate_dwarf_object(const Options &options) {
118120
const char *isa_name = (info->mode == Mode::BIT32) ? "x86" : "x86_64";
119121

120122
const char *dwarf_version = "V2";
121-
int endian = (inf.is_be()) ? DW_DLC_TARGET_BIGENDIAN : DW_DLC_TARGET_LITTLEENDIAN;
123+
int endian = inf_is_be() ? DW_DLC_TARGET_BIGENDIAN : DW_DLC_TARGET_LITTLEENDIAN;
122124
Dwarf_Ptr errarg = 0;
123125

124126
decltype(&attached_info_callback) callback;
@@ -320,7 +322,7 @@ static void generate_copy_with_dbg_info(std::shared_ptr<DwarfGenInfo> info,
320322
/* Some compilers produce binaries with non-adjacent or overlapping sections,
321323
* so we cannot use the automatic layout. Suppress it and use the exact
322324
* layout from the input. */
323-
if (elf_flagelf(elf_out, ELF_C_SET, ELF_F_LAYOUT | ELF_F_LAYOUT_OVERLAP) == 0)
325+
if (elf_flagelf(elf_out, ELF_C_SET, ELF_F_LAYOUT/* | ELF_F_LAYOUT_OVERLAP */) == 0)
324326
dwarfexport_error("elf_flagelf failed: ", elf_errmsg(-1));
325327

326328
if (gelf_getehdr(elf_out, &ehdr_out) != &ehdr_out)
@@ -470,7 +472,7 @@ void generate_detached_dbg_info(std::shared_ptr<DwarfGenInfo> info,
470472
}
471473

472474
// TODO: this is not necessarily an error
473-
if (write(fd, bytes, length) != length) {
475+
if (write(fd, bytes, length) != (ssize_t)length) {
474476
dwarfexport_error("write() failed");
475477
}
476478
}

0 commit comments

Comments
 (0)