This is the mail archive of the sid@sources.redhat.com mailing list for the SID project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]