mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-05 16:26:14 +02:00
* fixed import by ordinal number for all Windows targets when using external linker.
git-svn-id: trunk@3830 -
This commit is contained in:
parent
90b40e9385
commit
8bef50f29f
@ -2078,14 +2078,8 @@ const
|
|||||||
result:='';
|
result:='';
|
||||||
if not(po_external in pd.procoptions) then
|
if not(po_external in pd.procoptions) then
|
||||||
internalerror(200412151);
|
internalerror(200412151);
|
||||||
{ import by number? }
|
{ external name or number is specified }
|
||||||
if pd.import_nr<>0 then
|
if assigned(pd.import_name) or (pd.import_nr<>0) then
|
||||||
begin
|
|
||||||
{ Nothing to do }
|
|
||||||
end
|
|
||||||
else
|
|
||||||
{ external name specified }
|
|
||||||
if assigned(pd.import_name) then
|
|
||||||
begin
|
begin
|
||||||
if assigned(pd.import_dll) then
|
if assigned(pd.import_dll) then
|
||||||
begin
|
begin
|
||||||
@ -2100,11 +2094,16 @@ const
|
|||||||
{ keep normal mangledname }
|
{ keep normal mangledname }
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
|
if assigned(pd.import_name) then
|
||||||
|
begin
|
||||||
if target_info.system in system_all_windows then
|
if target_info.system in system_all_windows then
|
||||||
{ cprefix is not used in DLL imports under Windows }
|
{ cprefix is not used in DLL imports under Windows }
|
||||||
result:=pd.import_name^
|
result:=pd.import_name^
|
||||||
else
|
else
|
||||||
result:=maybe_cprefix(pd.import_name^);
|
result:=maybe_cprefix(pd.import_name^);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
result:=splitfilename(pd.import_dll^)+'_index_'+tostr(pd.import_nr);
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -149,7 +149,7 @@ implementation
|
|||||||
hp2:=twin32imported_item(hp1.imported_items.first);
|
hp2:=twin32imported_item(hp1.imported_items.first);
|
||||||
while assigned(hp2) do
|
while assigned(hp2) do
|
||||||
begin
|
begin
|
||||||
if (hp2.name^=name) then
|
if (hp2.name^=name) and (hp2.ordnr=index) then
|
||||||
break;
|
break;
|
||||||
hp2:=twin32imported_item(hp2.next);
|
hp2:=twin32imported_item(hp2.next);
|
||||||
end;
|
end;
|
||||||
@ -369,9 +369,28 @@ implementation
|
|||||||
objdata.writebytes(emptyint,align(objdata.CurrObjSec.size,2)-objdata.CurrObjSec.size);
|
objdata.writebytes(emptyint,align(objdata.CurrObjSec.size,2)-objdata.CurrObjSec.size);
|
||||||
{ idata4, import lookup table }
|
{ idata4, import lookup table }
|
||||||
objdata.SetSection(idata4objsection);
|
objdata.SetSection(idata4objsection);
|
||||||
|
if afuncname<>'' then
|
||||||
|
begin
|
||||||
objdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA);
|
objdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA);
|
||||||
if target_info.system=system_x86_64_win64 then
|
if target_info.system=system_x86_64_win64 then
|
||||||
objdata.writebytes(emptyint,sizeof(emptyint));
|
objdata.writebytes(emptyint,sizeof(emptyint));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
emptyint:=ordnr;
|
||||||
|
if target_info.system=system_x86_64_win64 then
|
||||||
|
begin
|
||||||
|
objdata.writebytes(emptyint,sizeof(emptyint));
|
||||||
|
emptyint:=$80000000;
|
||||||
|
objdata.writebytes(emptyint,sizeof(emptyint));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
emptyint:=emptyint or $80000000;
|
||||||
|
objdata.writebytes(emptyint,sizeof(emptyint));
|
||||||
|
end;
|
||||||
|
emptyint:=0;
|
||||||
|
end;
|
||||||
{ idata5, import address table }
|
{ idata5, import address table }
|
||||||
objdata.SetSection(idata5objsection);
|
objdata.SetSection(idata5objsection);
|
||||||
if isvar then
|
if isvar then
|
||||||
@ -385,7 +404,10 @@ implementation
|
|||||||
if not isvar then
|
if not isvar then
|
||||||
begin
|
begin
|
||||||
objdata.SetSection(textobjsection);
|
objdata.SetSection(textobjsection);
|
||||||
implabel:=objdata.SymbolDefine(afuncname,AB_GLOBAL,AT_FUNCTION);
|
if afuncname <> '' then
|
||||||
|
implabel:=objdata.SymbolDefine(afuncname,AB_GLOBAL,AT_FUNCTION)
|
||||||
|
else
|
||||||
|
implabel:=objdata.SymbolDefine(basedllname+'_index_'+tostr(ordnr),AB_GLOBAL,AT_FUNCTION);
|
||||||
objdata.writebytes(jmpopcode,sizeof(jmpopcode));
|
objdata.writebytes(jmpopcode,sizeof(jmpopcode));
|
||||||
objdata.writereloc(0,sizeof(longint),idata5label,RELOC_ABSOLUTE32);
|
objdata.writereloc(0,sizeof(longint),idata5label,RELOC_ABSOLUTE32);
|
||||||
objdata.writebytes(nopopcodes,align(objdata.CurrObjSec.size,sizeof(nopopcodes))-objdata.CurrObjSec.size);
|
objdata.writebytes(nopopcodes,align(objdata.CurrObjSec.size,sizeof(nopopcodes))-objdata.CurrObjSec.size);
|
||||||
@ -518,7 +540,10 @@ implementation
|
|||||||
{ create indirect jump and }
|
{ create indirect jump and }
|
||||||
{ place jump in al_procedures }
|
{ place jump in al_procedures }
|
||||||
new_section(current_asmdata.asmlists[al_imports],sec_code,'',0);
|
new_section(current_asmdata.asmlists[al_imports],sec_code,'',0);
|
||||||
current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(target_info.cprefix+hp2.func^,AT_FUNCTION,0));
|
if hp2.name^ <> '' then
|
||||||
|
current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(hp2.name^,AT_FUNCTION,0))
|
||||||
|
else
|
||||||
|
current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(splitfilename(hp1.dllname^)+'_index_'+tostr(hp2.ordnr),AT_FUNCTION,0));
|
||||||
current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
|
current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
|
||||||
{$ifdef ARM}
|
{$ifdef ARM}
|
||||||
reference_reset_symbol(href,l5,0);
|
reference_reset_symbol(href,l5,0);
|
||||||
|
Loading…
Reference in New Issue
Block a user