From eb993acd2a1cf23e7e100334c60201af0dd8f1db Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 8 Jan 2017 20:16:32 -0500 Subject: [PATCH] -n flag to inhibit symbol lookup in expressions. --- dumpobj.cpp | 12 ++++++++++-- zrdz_disassembler.cpp | 18 ++++++++++++++++++ zrdz_disassembler.h | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/dumpobj.cpp b/dumpobj.cpp index fa5fe0e..aa1f496 100644 --- a/dumpobj.cpp +++ b/dumpobj.cpp @@ -30,6 +30,7 @@ struct { bool _S = false; bool _g = false; + bool _n = false; } flags; @@ -285,7 +286,13 @@ bool dump_obj(const char *name, int fd) uint8_t section = read_8(iter); uint32_t offset = read_32(iter); - std::string name = d.location_name(section, offset); + + std::string name; + if (flags._n) { + name = d.section_name(section) + "+" + d.to_x(offset, 4, '$'); + } else { + name = d.location_name(section, offset); + } stack.emplace_back(std::move(name)); break; } @@ -636,10 +643,11 @@ void dump(const char *name) { int main(int argc, char **argv) { int c; - while ((c = getopt(argc, argv, "Sg")) != -1) { + while ((c = getopt(argc, argv, "Sgn")) != -1) { switch(c) { case 'S': flags._S = true; break; case 'g': flags._g = true; break; + case 'n': flags._n = true; break; default: exit(EX_USAGE); break; } } diff --git a/zrdz_disassembler.cpp b/zrdz_disassembler.cpp index cad725d..2b83a67 100644 --- a/zrdz_disassembler.cpp +++ b/zrdz_disassembler.cpp @@ -374,3 +374,21 @@ std::string zrdz_disassembler::symbol_name(unsigned entry) const { } return _symbols[entry].name; } + +std::string zrdz_disassembler::section_name(unsigned section) const { + + std::string defname = std::string("section") + std::to_string(section); + + if (section >= _sections.size()) { + warnx("Invalid section %d", section); + return defname; + } + auto &e = _sections[section]; + if (!e.valid) { + warnx("Invalid section %d", section); + return defname; + } + + return e.name; +} + diff --git a/zrdz_disassembler.h b/zrdz_disassembler.h index d1ea8b9..2d85f53 100644 --- a/zrdz_disassembler.h +++ b/zrdz_disassembler.h @@ -39,6 +39,7 @@ public: std::string location_name(unsigned section, uint32_t offset) const; std::string symbol_name(unsigned entry) const; + std::string section_name(unsigned entry) const; protected: