mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-27 07:10:11 +02:00
* add texeheader.ImgOffset to all file offsets when reading an ELF file. This
will be useful for reading i8086-msdos dwarf debug info, because it is appended after the regular dos MZ exe in an ELF32 image by the watcom linker. git-svn-id: trunk@39030 -
This commit is contained in:
parent
3bcd21663e
commit
537fbefb9e
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user