|
@@ -815,7 +815,7 @@ type
|
|
|
|
|
|
{$ifdef FIND_BASEADDR_ELF}
|
|
{$ifdef FIND_BASEADDR_ELF}
|
|
var
|
|
var
|
|
- LocalJmpBuf : Jmp_Buf;
|
|
|
|
|
|
+ LocalJmpBuf : Jmp_Buf;
|
|
procedure LocalError;
|
|
procedure LocalError;
|
|
begin
|
|
begin
|
|
Longjmp(LocalJmpBuf,1);
|
|
Longjmp(LocalJmpBuf,1);
|
|
@@ -928,15 +928,16 @@ var
|
|
begin
|
|
begin
|
|
OpenElf:=false;
|
|
OpenElf:=false;
|
|
{ read and check header }
|
|
{ read and check header }
|
|
- if e.size<sizeof(telfheader) then
|
|
|
|
|
|
+ if e.size<(sizeof(telfheader)+e.ImgOffset) then
|
|
exit;
|
|
exit;
|
|
|
|
+ seek(e.f,e.ImgOffset);
|
|
blockread(e.f,elfheader,sizeof(telfheader));
|
|
blockread(e.f,elfheader,sizeof(telfheader));
|
|
if elfheader.magic0123<>{$ifdef ENDIAN_LITTLE}$464c457f{$else}$7f454c46{$endif} then
|
|
if elfheader.magic0123<>{$ifdef ENDIAN_LITTLE}$464c457f{$else}$7f454c46{$endif} then
|
|
exit;
|
|
exit;
|
|
if elfheader.e_shentsize<>sizeof(telfsechdr) then
|
|
if elfheader.e_shentsize<>sizeof(telfsechdr) then
|
|
exit;
|
|
exit;
|
|
{ read section names }
|
|
{ read section names }
|
|
- seek(e.f,elfheader.e_shoff+elfheader.e_shstrndx*cardinal(sizeof(telfsechdr)));
|
|
|
|
|
|
+ seek(e.f,e.ImgOffset+elfheader.e_shoff+elfheader.e_shstrndx*cardinal(sizeof(telfsechdr)));
|
|
blockread(e.f,elfsec,sizeof(telfsechdr));
|
|
blockread(e.f,elfsec,sizeof(telfsechdr));
|
|
e.secstrofs:=elfsec.sh_offset;
|
|
e.secstrofs:=elfsec.sh_offset;
|
|
e.sechdrofs:=elfheader.e_shoff;
|
|
e.sechdrofs:=elfheader.e_shoff;
|
|
@@ -944,7 +945,7 @@ begin
|
|
|
|
|
|
{ scan program headers to find the image base address }
|
|
{ scan program headers to find the image base address }
|
|
e.processaddress:=High(e.processaddress);
|
|
e.processaddress:=High(e.processaddress);
|
|
- seek(e.f,elfheader.e_phoff);
|
|
|
|
|
|
+ seek(e.f,e.ImgOffset+elfheader.e_phoff);
|
|
for i:=1 to elfheader.e_phnum do
|
|
for i:=1 to elfheader.e_phnum do
|
|
begin
|
|
begin
|
|
blockread(e.f,phdr,sizeof(phdr));
|
|
blockread(e.f,phdr,sizeof(phdr));
|
|
@@ -968,19 +969,19 @@ var
|
|
bufsize,i : longint;
|
|
bufsize,i : longint;
|
|
begin
|
|
begin
|
|
FindSectionElf:=false;
|
|
FindSectionElf:=false;
|
|
- seek(e.f,e.sechdrofs);
|
|
|
|
|
|
+ seek(e.f,e.ImgOffset+e.sechdrofs);
|
|
for i:=1 to e.nsects do
|
|
for i:=1 to e.nsects do
|
|
begin
|
|
begin
|
|
blockread(e.f,elfsec,sizeof(telfsechdr));
|
|
blockread(e.f,elfsec,sizeof(telfsechdr));
|
|
fillchar(secnamebuf,sizeof(secnamebuf),0);
|
|
fillchar(secnamebuf,sizeof(secnamebuf),0);
|
|
oldofs:=filepos(e.f);
|
|
oldofs:=filepos(e.f);
|
|
- seek(e.f,e.secstrofs+elfsec.sh_name);
|
|
|
|
|
|
+ seek(e.f,e.ImgOffset+e.secstrofs+elfsec.sh_name);
|
|
blockread(e.f,secnamebuf,sizeof(secnamebuf)-1,bufsize);
|
|
blockread(e.f,secnamebuf,sizeof(secnamebuf)-1,bufsize);
|
|
seek(e.f,oldofs);
|
|
seek(e.f,oldofs);
|
|
secname:=strpas(secnamebuf);
|
|
secname:=strpas(secnamebuf);
|
|
if asecname=secname then
|
|
if asecname=secname then
|
|
begin
|
|
begin
|
|
- secofs:=elfsec.sh_offset;
|
|
|
|
|
|
+ secofs:=e.ImgOffset+elfsec.sh_offset;
|
|
seclen:=elfsec.sh_size;
|
|
seclen:=elfsec.sh_size;
|
|
FindSectionElf:=true;
|
|
FindSectionElf:=true;
|
|
exit;
|
|
exit;
|