mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-01 21:26:03 +02:00
* Changed writing section symbols to use storage class COFF_SYM_LOCAL (3), this is what is used by both GCC and MSVC. Previously used COFF_SYM_SECTION (104) is accepted by GNU binutils, but only for PE targets (and silently converted to COFF_SYM_LOCAL), for DJGPP it issues warnings.
* Assign section indexes independent from symbol indexing. * Fixed section flags not assigned while reading DJGPP object files. * Fixed objData type for TDJCoffexeoutput. * Fixed entry point address of DJGPP executables. * Fixed filling exe section headers for DJGPP. git-svn-id: trunk@21396 -
This commit is contained in:
parent
a2426178dc
commit
35e3e363dd
@ -493,7 +493,7 @@ implementation
|
||||
strpos : longword;
|
||||
value : longword;
|
||||
section : smallint;
|
||||
empty : word;
|
||||
empty : word; { actually type, $20: function, 0: not a function }
|
||||
typ : byte;
|
||||
aux : byte;
|
||||
end;
|
||||
@ -1250,9 +1250,15 @@ const pemagic : array[0..3] of byte = (
|
||||
begin
|
||||
with TCoffObjSection(p) do
|
||||
begin
|
||||
secidx:=symidx div 2;
|
||||
Inc(plongword(arg)^);
|
||||
secidx:=plongword(arg)^;
|
||||
|
||||
secsymidx:=symidx;
|
||||
write_symbol(name,mempos,secidx,COFF_SYM_SECTION,1);
|
||||
{ Both GNU and Microsoft toolchains write section symbols using
|
||||
storage class 3 (STATIC).
|
||||
No reason to use COFF_SYM_SECTION, it is silently converted to 3 by
|
||||
PE binutils and causes warnings with DJGPP binutils. }
|
||||
write_symbol(name,mempos,secidx,COFF_SYM_LOCAL,1);
|
||||
{ AUX }
|
||||
fillchar(secrec,sizeof(secrec),0);
|
||||
secrec.len:=Size;
|
||||
@ -1356,6 +1362,7 @@ const pemagic : array[0..3] of byte = (
|
||||
i : longint;
|
||||
value : aword;
|
||||
objsym : TObjSymbol;
|
||||
secidx : longword;
|
||||
begin
|
||||
with TCoffObjData(data) do
|
||||
begin
|
||||
@ -1367,29 +1374,30 @@ const pemagic : array[0..3] of byte = (
|
||||
inc(symidx);
|
||||
FCoffSyms.write(filename[1],sizeof(filename)-1);
|
||||
{ Sections }
|
||||
ObjSectionList.ForEachCall(@section_write_symbol,nil);
|
||||
secidx:=0;
|
||||
ObjSectionList.ForEachCall(@section_write_symbol,@secidx);
|
||||
{ ObjSymbols }
|
||||
for i:=0 to ObjSymbolList.Count-1 do
|
||||
begin
|
||||
objsym:=TObjSymbol(ObjSymbolList[i]);
|
||||
if (objsym.typ=AT_LABEL) and (objsym.bind=AB_LOCAL) then
|
||||
if (objsym.bind=AB_LOCAL) then
|
||||
continue;
|
||||
case objsym.bind of
|
||||
AB_GLOBAL :
|
||||
begin
|
||||
globalval:=2;
|
||||
globalval:=COFF_SYM_GLOBAL;
|
||||
sectionval:=TCoffObjSection(objsym.objsection).secidx;
|
||||
value:=objsym.address;
|
||||
end;
|
||||
AB_LOCAL :
|
||||
begin
|
||||
globalval:=3;
|
||||
globalval:=COFF_SYM_LOCAL;
|
||||
sectionval:=TCoffObjSection(objsym.objsection).secidx;
|
||||
value:=objsym.address;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
globalval:=2;
|
||||
globalval:=COFF_SYM_GLOBAL;
|
||||
sectionval:=0;
|
||||
value:=objsym.size;
|
||||
end;
|
||||
@ -1765,12 +1773,11 @@ const pemagic : array[0..3] of byte = (
|
||||
{ do not add constants (section=-1) }
|
||||
if sym.section<>-1 then
|
||||
begin
|
||||
bind:=AB_LOCAL;
|
||||
objsec:=GetSection(sym.section);
|
||||
if sym.value>=objsec.mempos then
|
||||
address:=sym.value-objsec.mempos;
|
||||
objsym:=CreateSymbol(strname);
|
||||
objsym.bind:=bind;
|
||||
objsym.bind:=AB_LOCAL;
|
||||
objsym.typ:=AT_FUNCTION;
|
||||
objsym.objsection:=objsec;
|
||||
objsym.offset:=address;
|
||||
@ -1934,7 +1941,7 @@ const pemagic : array[0..3] of byte = (
|
||||
pedecodesechdrflags(secname,sechdr.flags,secoptions,secalign)
|
||||
else
|
||||
begin
|
||||
djdecodesechdrflags(secname,sechdr.flags);
|
||||
secoptions:=djdecodesechdrflags(secname,sechdr.flags);
|
||||
secalign:=sizeof(pint);
|
||||
end;
|
||||
if (Length(secname)>3) and (secname[2] in ['e','f','i','p','r']) then
|
||||
@ -2116,22 +2123,21 @@ const pemagic : array[0..3] of byte = (
|
||||
move(s[1],sechdr.name,length(s));
|
||||
sechdr.rvaofs:=mempos;
|
||||
if win32 then
|
||||
sechdr.vsize:=Size
|
||||
else
|
||||
sechdr.vsize:=mempos;
|
||||
|
||||
{ sechdr.dataSize is size of initilized data. Must be zero for sections that
|
||||
do not contain one. In Windows it must be rounded up to FileAlignment
|
||||
(so it can be greater than VirtualSize) }
|
||||
if (oso_data in SecOptions) then
|
||||
begin
|
||||
if win32 then
|
||||
sechdr.dataSize:=Align(Size,SectionDataAlign)
|
||||
else
|
||||
sechdr.dataSize:=Size;
|
||||
if (Size>0) then
|
||||
sechdr.datapos:=datapos;
|
||||
sechdr.vsize:=Size;
|
||||
{ sechdr.dataSize is size of initialized data, rounded up to FileAlignment
|
||||
(so it can be greater than VirtualSize). Must be zero for sections that
|
||||
do not contain initialized data. }
|
||||
if (oso_data in SecOptions) then
|
||||
sechdr.datasize:=Align(Size,SectionDataAlign);
|
||||
end
|
||||
else
|
||||
begin
|
||||
sechdr.vsize:=mempos;
|
||||
sechdr.datasize:=Size;
|
||||
end;
|
||||
if (Size>0) then
|
||||
sechdr.datapos:=datapos;
|
||||
sechdr.nrelocs:=0;
|
||||
sechdr.relocpos:=0;
|
||||
if win32 then
|
||||
@ -2489,7 +2495,7 @@ const pemagic : array[0..3] of byte = (
|
||||
djoptheader.bsize:=BSSExeSec.Size;
|
||||
djoptheader.text_start:=TextExeSec.mempos;
|
||||
djoptheader.data_start:=DataExeSec.mempos;
|
||||
djoptheader.entry:=EntrySym.offset;
|
||||
djoptheader.entry:=EntrySym.Address;
|
||||
FWriter.write(djoptheader,sizeof(djoptheader));
|
||||
end;
|
||||
|
||||
@ -2551,7 +2557,7 @@ const pemagic : array[0..3] of byte = (
|
||||
begin
|
||||
inherited createcoff(false);
|
||||
CExeSection:=TDJCoffExeSection;
|
||||
CObjData:=TPECoffObjData;
|
||||
CObjData:=TDJCoffObjData;
|
||||
end;
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user