mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 21:49:43 +02:00
* use .comm again for global variables
this is needed for shared library linking where the .so needs to resolve to the space allocated for the symbol in the main program git-svn-id: trunk@6641 -
This commit is contained in:
parent
358546ec2f
commit
e0c58d3658
@ -615,22 +615,26 @@ implementation
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ The .comm is required for COMMON symbols. These are used
|
||||
in the shared library loading. All the symbols declared in
|
||||
the .so file need to resolve to the data allocated in the main
|
||||
program (PFV) }
|
||||
if Tai_datablock(hp).is_global then
|
||||
begin
|
||||
asmwrite(#9'.globl ');
|
||||
asmwriteln(Tai_datablock(hp).sym.name);
|
||||
end;
|
||||
if (target_info.system <> system_arm_linux) then
|
||||
sepChar := '@'
|
||||
asmwrite(#9'.comm'#9);
|
||||
asmwrite(tai_datablock(hp).sym.name);
|
||||
asmwrite(','+tostr(tai_datablock(hp).size));
|
||||
asmwrite(','+tostr(last_align));
|
||||
asmwriteln('');
|
||||
end
|
||||
else
|
||||
sepChar := '%';
|
||||
if (tf_needs_symbol_type in target_info.flags) then
|
||||
asmwriteln(#9'.type '+Tai_datablock(hp).sym.name+','+sepChar+'object');
|
||||
if (tf_needs_symbol_size in target_info.flags) and (tai_datablock(hp).size > 0) then
|
||||
asmwriteln(#9'.size '+Tai_datablock(hp).sym.name+','+tostr(Tai_datablock(hp).size));
|
||||
asmwrite(Tai_datablock(hp).sym.name);
|
||||
asmwriteln(':');
|
||||
asmwriteln(#9'.zero '+tostr(Tai_datablock(hp).size));
|
||||
begin
|
||||
asmwrite(#9'.lcomm'#9);
|
||||
asmwrite(tai_datablock(hp).sym.name);
|
||||
asmwrite(','+tostr(tai_datablock(hp).size));
|
||||
asmwrite(','+tostr(last_align));
|
||||
asmwriteln('');
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -276,7 +276,6 @@ Implementation
|
||||
end;
|
||||
|
||||
var
|
||||
dir : TSearchRec;
|
||||
hs : string;
|
||||
begin
|
||||
if PathExists(s,false) then
|
||||
@ -713,6 +712,8 @@ Implementation
|
||||
end;
|
||||
hs[0]:=chr(len);
|
||||
val(hs,exprvalue,code);
|
||||
if code<>0 then
|
||||
internalerror(200702251);
|
||||
end;
|
||||
'.','_',
|
||||
'A'..'Z',
|
||||
@ -918,9 +919,14 @@ Implementation
|
||||
end;
|
||||
ait_datablock :
|
||||
begin
|
||||
ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
|
||||
ObjData.SymbolDefine(Tai_datablock(hp).sym);
|
||||
ObjData.alloc(Tai_datablock(hp).size);
|
||||
if Tai_datablock(hp).is_global then
|
||||
ObjData.SymbolDefine(Tai_datablock(hp).sym)
|
||||
else
|
||||
begin
|
||||
ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
|
||||
ObjData.SymbolDefine(Tai_datablock(hp).sym);
|
||||
ObjData.alloc(Tai_datablock(hp).size);
|
||||
end;
|
||||
end;
|
||||
ait_real_80bit :
|
||||
ObjData.alloc(10);
|
||||
@ -979,10 +985,19 @@ Implementation
|
||||
begin
|
||||
if (oso_data in ObjData.CurrObjSec.secoptions) then
|
||||
Message(asmw_e_alloc_data_only_in_bss);
|
||||
ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
|
||||
objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
|
||||
objsym.size:=Tai_datablock(hp).size;
|
||||
ObjData.alloc(Tai_datablock(hp).size);
|
||||
if Tai_datablock(hp).is_global then
|
||||
begin
|
||||
objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
|
||||
objsym.size:=Tai_datablock(hp).size;
|
||||
objsym.bind:=AB_COMMON;
|
||||
end
|
||||
else
|
||||
begin
|
||||
ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
|
||||
objsym:=ObjData.SymbolDefine(Tai_datablock(hp).sym);
|
||||
objsym.size:=Tai_datablock(hp).size;
|
||||
ObjData.alloc(Tai_datablock(hp).size);
|
||||
end;
|
||||
end;
|
||||
ait_real_80bit :
|
||||
ObjData.alloc(10);
|
||||
@ -1074,9 +1089,12 @@ Implementation
|
||||
end;
|
||||
ait_datablock :
|
||||
begin
|
||||
ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
|
||||
ObjOutput.exportsymbol(ObjData.SymbolRef(Tai_datablock(hp).sym));
|
||||
ObjData.alloc(Tai_datablock(hp).size);
|
||||
if not Tai_datablock(hp).is_global then
|
||||
begin
|
||||
ObjData.allocalign(used_align(size_2_align(Tai_datablock(hp).size),0,ObjData.CurrObjSec.secalign));
|
||||
ObjData.alloc(Tai_datablock(hp).size);
|
||||
end;
|
||||
end;
|
||||
ait_real_80bit :
|
||||
ObjData.writebytes(Tai_real_80bit(hp).value,10);
|
||||
|
Loading…
Reference in New Issue
Block a user