ELF Loader: Use physical addresses instead of virtual ones.
This works in SE mode because the virtual and physical addresses specified for segments are the same. In Alpha, the LoadAddrMask is still necessary because the virtual and physical addresses are the same and apparently rely on the super page mechanism. All of the regressions pass. --HG-- extra : convert_revision : 45e49dec5002d64e541bc466c61a0f304af29ea5
This commit is contained in:
parent
a630d77ec5
commit
f6e5b92d63
1 changed files with 11 additions and 11 deletions
|
@ -176,7 +176,7 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
|
||||||
if(phdr.p_offset <= e_phoff &&
|
if(phdr.p_offset <= e_phoff &&
|
||||||
phdr.p_offset + phdr.p_filesz > e_phoff)
|
phdr.p_offset + phdr.p_filesz > e_phoff)
|
||||||
{
|
{
|
||||||
result->_programHeaderTable = phdr.p_vaddr + e_phoff;
|
result->_programHeaderTable = phdr.p_paddr + e_phoff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,28 +261,28 @@ ElfObject::ElfObject(const string &_filename, int _fd,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Check to see if this segment contains the bss section.
|
// Check to see if this segment contains the bss section.
|
||||||
if (phdr.p_vaddr <= bssSecStart &&
|
if (phdr.p_paddr <= bssSecStart &&
|
||||||
phdr.p_vaddr + phdr.p_memsz > bssSecStart &&
|
phdr.p_paddr + phdr.p_memsz > bssSecStart &&
|
||||||
phdr.p_memsz - phdr.p_filesz > 0) {
|
phdr.p_memsz - phdr.p_filesz > 0) {
|
||||||
bss.baseAddr = phdr.p_vaddr + phdr.p_filesz;
|
bss.baseAddr = phdr.p_paddr + phdr.p_filesz;
|
||||||
bss.size = phdr.p_memsz - phdr.p_filesz;
|
bss.size = phdr.p_memsz - phdr.p_filesz;
|
||||||
bss.fileImage = NULL;
|
bss.fileImage = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if this is the text or data segment
|
// Check to see if this is the text or data segment
|
||||||
if (phdr.p_vaddr <= textSecStart &&
|
if (phdr.p_paddr <= textSecStart &&
|
||||||
phdr.p_vaddr + phdr.p_filesz > textSecStart) {
|
phdr.p_paddr + phdr.p_filesz > textSecStart) {
|
||||||
text.baseAddr = phdr.p_vaddr;
|
text.baseAddr = phdr.p_paddr;
|
||||||
text.size = phdr.p_filesz;
|
text.size = phdr.p_filesz;
|
||||||
text.fileImage = fileData + phdr.p_offset;
|
text.fileImage = fileData + phdr.p_offset;
|
||||||
} else if (phdr.p_vaddr <= dataSecStart &&
|
} else if (phdr.p_paddr <= dataSecStart &&
|
||||||
phdr.p_vaddr + phdr.p_filesz > dataSecStart) {
|
phdr.p_paddr + phdr.p_filesz > dataSecStart) {
|
||||||
data.baseAddr = phdr.p_vaddr;
|
data.baseAddr = phdr.p_paddr;
|
||||||
data.size = phdr.p_filesz;
|
data.size = phdr.p_filesz;
|
||||||
data.fileImage = fileData + phdr.p_offset;
|
data.fileImage = fileData + phdr.p_offset;
|
||||||
} else {
|
} else {
|
||||||
Segment extra;
|
Segment extra;
|
||||||
extra.baseAddr = phdr.p_vaddr;
|
extra.baseAddr = phdr.p_paddr;
|
||||||
extra.size = phdr.p_filesz;
|
extra.size = phdr.p_filesz;
|
||||||
extra.fileImage = fileData + phdr.p_offset;
|
extra.fileImage = fileData + phdr.p_offset;
|
||||||
extraSegments.push_back(extra);
|
extraSegments.push_back(extra);
|
||||||
|
|
Loading…
Reference in a new issue