Mercurial > hg-old > index.cgi
view lwdisasm/do_raw.c @ 448:5cccf90bf838 3.0 tip
Fixed bug with complex external references generating invalid relocations in the object file
author | lost@l-w.ca |
---|---|
date | Fri, 05 Nov 2010 22:27:00 -0600 |
parents | cba03436c720 |
children |
line wrap: on
line source
/* do_raw.c Copyright © 2010 William Astle This file is part of LWTOOLS. LWTOOLS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <stdio.h> #include <stdlib.h> #include "lwdisasm.h" void do_disasm_raw(disasmstate_t *as) { linedata_t *l; symbol_t *s; char bytebuf[11]; int i; // initialize disassembly as -> curoff = as -> entry; as -> crange = lookup_range(as, as -> curoff); while (l = disasm_insn(as)) { if (!as -> ltail) as -> lhead = l; else as -> ltail -> next = l; l -> prev = as -> ltail; as -> ltail = l; if (l -> target != -1) { s = register_symbol(as, l -> target, l -> sectionref, NULL); l -> symbol = s; } } attach_symbols(as); for (l = as -> lhead; l; l = l -> next) { if (l -> target != -1) redisasm_insn(as, l); } for (l = as -> lhead; l; l = l -> next) { bytebuf[0] = 0; for (i = 0; i < l -> length; i++) { sprintf(bytebuf, "%s%02X", bytebuf, l -> bytes[i]); } printf("%04X %-10s %-15s %s\n", l -> address, bytebuf, l -> isref ? l -> symbol -> symbol : "", l -> disasm); } }