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);	
	}
}