diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 534417c7fc..5a2557f636 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -2078,38 +2078,37 @@ const result:=''; if not(po_external in pd.procoptions) then internalerror(200412151); - { import by number? } - if pd.import_nr<>0 then + { external name or number is specified } + 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 - if assigned(pd.import_dll) then - begin - { If we are not using direct dll linking under win32 then imports - need to use the normal name since to functions can refer to the - same DLL function. This is also needed for compatability - with Delphi and TP7 } - case target_info.system of - system_i386_emx, - system_i386_os2 : + if assigned(pd.import_dll) then + begin + { If we are not using direct dll linking under win32 then imports + need to use the normal name since to functions can refer to the + same DLL function. This is also needed for compatability + with Delphi and TP7 } + case target_info.system of + system_i386_emx, + system_i386_os2 : + begin + { keep normal mangledname } + end; + else + if assigned(pd.import_name) then begin - { keep normal mangledname } - end; + if target_info.system in system_all_windows then + { cprefix is not used in DLL imports under Windows } + result:=pd.import_name^ + else + result:=maybe_cprefix(pd.import_name^); + end else - if target_info.system in system_all_windows then - { cprefix is not used in DLL imports under Windows } - result:=pd.import_name^ - else - result:=maybe_cprefix(pd.import_name^); - end; - end - else - result:=maybe_cprefix(pd.import_name^); - end + result:=splitfilename(pd.import_dll^)+'_index_'+tostr(pd.import_nr); + end; + end + else + result:=maybe_cprefix(pd.import_name^); + end else begin { Default names when importing variables } diff --git a/compiler/systems/t_win.pas b/compiler/systems/t_win.pas index b5c7b0f5fa..4ed500eab0 100644 --- a/compiler/systems/t_win.pas +++ b/compiler/systems/t_win.pas @@ -149,7 +149,7 @@ implementation hp2:=twin32imported_item(hp1.imported_items.first); while assigned(hp2) do begin - if (hp2.name^=name) then + if (hp2.name^=name) and (hp2.ordnr=index) then break; hp2:=twin32imported_item(hp2.next); end; @@ -369,9 +369,28 @@ implementation objdata.writebytes(emptyint,align(objdata.CurrObjSec.size,2)-objdata.CurrObjSec.size); { idata4, import lookup table } objdata.SetSection(idata4objsection); - objdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA); - if target_info.system=system_x86_64_win64 then - objdata.writebytes(emptyint,sizeof(emptyint)); + if afuncname<>'' then + begin + objdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA); + if target_info.system=system_x86_64_win64 then + 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 } objdata.SetSection(idata5objsection); if isvar then @@ -385,7 +404,10 @@ implementation if not isvar then begin 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.writereloc(0,sizeof(longint),idata5label,RELOC_ABSOLUTE32); objdata.writebytes(nopopcodes,align(objdata.CurrObjSec.size,sizeof(nopopcodes))-objdata.CurrObjSec.size); @@ -518,7 +540,10 @@ implementation { create indirect jump and } { place jump in al_procedures } 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('')); {$ifdef ARM} reference_reset_symbol(href,l5,0);