Minor fixes to loader and an additional header file in alpha_access.h

when we are compiling the console.

base/loader/elf_object.cc:
    added code to verify that the .bss section is 0;
    added code to only load function and label types
dev/alpha_access.h:
    include inittypes if we are compiling the console code

--HG--
extra : convert_revision : b88fb36500b1c1003d44ed95cefdd2a30b7466b8
This commit is contained in:
Ali Saidi 2004-01-14 04:18:20 -05:00
parent a44248aab0
commit c9d88aa089
2 changed files with 21 additions and 3 deletions

View file

@ -115,10 +115,14 @@ ElfObject::loadSections(FunctionalMemory *mem, bool loadPhys)
Elf_Scn *section; Elf_Scn *section;
GElf_Shdr shdr; GElf_Shdr shdr;
GElf_Ehdr ehdr; GElf_Ehdr ehdr;
uint8_t *zeromem;
uint8_t *sectionData;
Addr address; Addr address;
char *secname; char *secname;
/* check that header matches library version */ /* check that header matches library version */
assert(elf_version(EV_CURRENT) != EV_NONE); assert(elf_version(EV_CURRENT) != EV_NONE);
@ -152,6 +156,9 @@ ElfObject::loadSections(FunctionalMemory *mem, bool loadPhys)
elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name), shdr.sh_addr, elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name), shdr.sh_addr,
shdr.sh_size, shdr.sh_offset, shdr.sh_flags, shdr.sh_flags & SHF_ALLOC ? "ALLOC" : ""); shdr.sh_size, shdr.sh_offset, shdr.sh_flags, shdr.sh_flags & SHF_ALLOC ? "ALLOC" : "");
secname = elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name); secname = elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name);
sectionData = fileData + shdr.sh_offset;
if(secname) if(secname)
{ {
if (strcmp(secname, ".text")==0) if (strcmp(secname, ".text")==0)
@ -168,6 +175,13 @@ ElfObject::loadSections(FunctionalMemory *mem, bool loadPhys)
{ {
bss.baseAddr = shdr.sh_addr; bss.baseAddr = shdr.sh_addr;
bss.size = shdr.sh_size; bss.size = shdr.sh_size;
/* If this is the .bss section it must be 0, so just
to be extra causious, lets allocate some memory
bzero it, and write that */
zeromem = (uint8_t*)malloc(shdr.sh_size);
memset(zeromem, 0, shdr.sh_size);
sectionData = zeromem;
} }
} }
if(shdr.sh_size != 0) if(shdr.sh_size != 0)
@ -175,11 +189,11 @@ ElfObject::loadSections(FunctionalMemory *mem, bool loadPhys)
if (loadPhys) if (loadPhys)
{ {
address = shdr.sh_addr &= (ULL(1) << 40) - 1; address = shdr.sh_addr &= (ULL(1) << 40) - 1;
mem->prot_write(address, fileData + shdr.sh_offset, shdr.sh_size); mem->prot_write(address, sectionData, shdr.sh_size);
} }
else else
{ {
mem->prot_write(shdr.sh_addr, fileData + shdr.sh_offset, shdr.sh_size); mem->prot_write(shdr.sh_addr, sectionData, shdr.sh_size);
} }
} }
@ -188,6 +202,7 @@ ElfObject::loadSections(FunctionalMemory *mem, bool loadPhys)
++secidx; ++secidx;
section = elf_getscn(elf, secidx); section = elf_getscn(elf, secidx);
} }
free(zeromem);
elf_end(elf); elf_end(elf);
@ -239,7 +254,8 @@ ElfObject::loadGlobalSymbols(SymbolTable *symtab)
for (ii = 0; ii < count; ++ii) for (ii = 0; ii < count; ++ii)
{ {
gelf_getsym(data, ii, &sym); gelf_getsym(data, ii, &sym);
if (GELF_ST_BIND(sym.st_info) & STB_GLOBAL) if ((GELF_ST_BIND(sym.st_info) & STB_GLOBAL) &&
((GELF_ST_TYPE(sym.st_info) == STT_FUNC) || (GELF_ST_TYPE(sym.st_info) == STT_NOTYPE)))
{ {
symtab->insert(sym.st_value, elf_strptr(elf, shdr.sh_link, sym.st_name)); symtab->insert(sym.st_value, elf_strptr(elf, shdr.sh_link, sym.st_name));
} }

View file

@ -39,6 +39,8 @@
#include <ostream> #include <ostream>
#include <string> #include <string>
class Checkpoint; class Checkpoint;
#else
#include <inttypes.h>
#endif #endif
// This structure hacked up from simos // This structure hacked up from simos