This is the mail archive of the
sid@sources.redhat.com
mailing list for the SID project.
SID ELF loader using wrong load address?
- From: Dave Brolley <brolley at redhat dot com>
- To: sid at sources dot redhat dot com
- Date: Mon, 04 Feb 2002 15:30:23 -0500
- Subject: SID ELF loader using wrong load address?
Hi,
I have a linker script for an application on an ELF target which
contains something like the following:
.reloc_section 0x1000 : AT (LOADADDR(.text)+SIZEOF(.text))
{
*(.reloc_section)
}
This is a section of code which should be loaded at the end of the .text
section and is intended to be copied (by the application itself) to
address 0x1000 before being executed. However, the SID ELF loader
currently loads this section at address 0x1000 (the VMA) instead of at
the given LMA. Visual inspection of a hex dump of my executable shows
that, for elf32, the address being used at offset 8 of the section
header is indeed the VMA and that the LMA is at offset 12 (can anyone
confirm this?).
The attached patch gets the section loaded at the proper LMA and has
been tested against my port (an internal one) and against xstormy16. I
would not expect any regressions since the LMA and the VMA are the same
unless one plays linker script tricks like the one above.
OK to commit?
Dave
2002-02-04 Dave Brolley <brolley@redhat.com>
* elfload.c (readElfFile): Obtain the load address from offset 24 for
elf64 and from offset 12 for elf32.
Index: sid/component/loader/elfload.c
===================================================================
RCS file: /cvs/src/src/sid/component/loader/elfload.c,v
retrieving revision 1.2
diff -c -p -r1.2 elfload.c
*** sid/component/loader/elfload.c 2001/01/13 14:26:05 1.2
--- sid/component/loader/elfload.c 2002/02/04 20:23:40
*************** readElfFile (PFLOAD func, unsigned* entr
*** 93,99 ****
}
if (fetchWord (psymHdr, littleEndian) == PT_LOAD)
{
! loadAreas[loadAreaCount].loadAddr = fetchQuad(psymHdr+16,
littleEndian);
loadAreas[loadAreaCount].offset = fetchQuad(psymHdr+8, littleEndian);
loadAreas[loadAreaCount].filesize = fetchQuad(psymHdr+32,
--- 93,99 ----
}
if (fetchWord (psymHdr, littleEndian) == PT_LOAD)
{
! loadAreas[loadAreaCount].loadAddr = fetchQuad(psymHdr+24,
littleEndian);
loadAreas[loadAreaCount].offset = fetchQuad(psymHdr+8, littleEndian);
loadAreas[loadAreaCount].filesize = fetchQuad(psymHdr+32,
*************** readElfFile (PFLOAD func, unsigned* entr
*** 111,117 ****
}
if (fetchWord (psymHdr, littleEndian) == PT_LOAD)
{
! loadAreas[loadAreaCount].loadAddr = fetchWord(psymHdr+8,
littleEndian);
loadAreas[loadAreaCount].offset = fetchWord(psymHdr+4, littleEndian);
loadAreas[loadAreaCount].filesize = fetchWord(psymHdr+16,
--- 111,117 ----
}
if (fetchWord (psymHdr, littleEndian) == PT_LOAD)
{
! loadAreas[loadAreaCount].loadAddr = fetchWord(psymHdr+12,
littleEndian);
loadAreas[loadAreaCount].offset = fetchWord(psymHdr+4, littleEndian);
loadAreas[loadAreaCount].filesize = fetchWord(psymHdr+16,