So it seems that we need to generate a module definition (.def) file in order 
to have all the ObjC class symbols exported in the DLL. This is also what 
WinObjC is doing, I’ll try to come up with a script to generate this file from 
the object file symbols.
https://github.com/microsoft/WinObjC/blob/develop/build/Foundation/dll/Foundation.def
 
<https://github.com/microsoft/WinObjC/blob/develop/build/Foundation/dll/Foundation.def>


However after manually creating a .def file with a few relevant symbols I still 
get the following linker error, which happens for any referenced Foundation 
class (NSArray is just an example):

> lld-link: error: undefined symbol: $_OBJC_REF_CLASS_NSArray
> >>> referenced by test.m:16
> >>>               C:\msys64\tmp\test-b84674.o:(WinMain)


I confirmed with dumpbin /exports that the .lib and DLL both contain these 
$_OBJC_REF_CLASS_ symbols, so I really don’t understand why it’s not found.


I’ve reproduced the issue from scratch using only libobjc2 and have written 
down the steps to reproduce here:
https://github.com/gnustep/libobjc2/issues/191 
<https://github.com/gnustep/libobjc2/issues/191>

Hopefully I’m just missing some flag somewhere when creating the DLL. I’d 
appreciate any thoughts.


Thanks!
Frederik



> Am 19.01.2021 um 20:50 schrieb Frederik Seiffert <frede...@algoriddim.com>:
> 
> Hi David,
> 
>> Am 19.01.2021 um 18:40 schrieb David Chisnall <gnus...@theravensnest.org 
>> <mailto:gnus...@theravensnest.org>>:
>> 
>> On ELF platforms, there were some issues with the ld -r invocation that 
>> -base Additions did.  Can you try just adding the .m files from Additions 
>> directly to the -base project and see if that makes the problem go away?  I 
>> don't think that PE/COFF linkage really has any concept that maps to how we 
>> do the subproject thing in -make.
> 
> I’m using "ar cr ..." instead of "ld -r" as the subproject merge command, as 
> that’s what the MinGW targets were using with Clang. I can also see all the 
> NS*.m.o object files of the various classes that I’m getting errors for being 
> passed directly to the linker, so I’m guessing that’s not it.
> 
> I can see with nm that the object files contain the relevant symbols, but the 
> generated gnustep-base.lib does not (not sure about the DLL). I’m wondering 
> if these symbols need to be specially marked to be exported or I’m missing 
> some linker flag? With MinGW we’re passing the object files between 
> --whole-archive / --no-whole-archive, but that flag isn’t recognized by 
> lld-link.
> 
> This is the (abbreviated) linker invocation I have right now:
> 
> clang -Wl,-dll -Wl,-export-all-symbols -fuse-ld=lld -Wl,/subsystem:console -o 
> ./obj/gnustep-base-1_27.dll obj/libgnustep-base.obj/GSArray.m.o 
> <all-other-object-files> Additions/obj/subproject.o win32/obj/subproject.o 
> -lffi -lWs2_32 -lpthread -ladvapi32 -luser32 -lshell32 -lnetapi32 -lobjc 
> 
> Thanks!
> 
> Frederik
> 

Reply via email to