Как загрузить DLL или файлы lib в LLVM?

Я новичок в LLVM. Вчера я построил LLVM и Clang на окнах GnuStep.

LLVM+CLang:3.2
GCC:4.6.1(GnuStep)
OS:Win7 64

Я могу скомпилировать исходный файлobjective-cкак для биткода, так и для exe. Exe работает, но когда я попытался выполнить биткод, я получил эту ошибку:

LLVM ERROR: Could not resolve external global address: 
    _OBJC_CLASS_NSConstantString

Вопросов:

How can I load dll or lib files in llvm? 
How can I link lib files(ex: libobjc.dll.a) to bitcode? Is that possible?

hello.m

#import 
int main(int argc, char**argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"Hello Objective-C\n");
    [pool release];
    return 0;
}

Makefile

CC=gcc
CCFLAGS=-fconstant-string-class=NSConstantString -ID:/GNUstep/GNUstep/System/Library/Headers
LDFLAGS=-LD:/GNUstep/GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base

CLANG=clang
CLANG_FLAG=-c -fobjc-runtime=gcc -emit-llvm

LLC=llc
LLI=lli
LLI_FLAG=-load=D:\GNUstep\GNUstep\System\Tools\objc-4.dll -load=D:\GNUstep\GNUstep\System\Tools\gnustep-base-1_24.dll
#LLI_FLAG=-load=D:\GNUstep\GNUstep\System\Library\Libraries\libgnustep-base.dll.a -load=D:\GNUstep\GNUstep\System\Library\Libraries\libobjc.dll.a

all:hello.obj hello1.exe

hello.exe: hello.o
     $(CC) -o hello.exe hello.o $(LDFLAGS)

hello.obj: hello.bc
    $(LLC) -filetype=obj hello.bc

hello.bc:hello.m
    $(CLANG) -o hello.bc hello.m $(CLANG_FLAG) $(CCFLAGS)

hello1.exe: hello.m
    $(CLANG) hello.m -o hello1.exe $(CCFLAGS) $(LDFLAGS)

run:
#Err
    $(LLI)  $(LLI_FLAG) -force-interpreter=false hello.bc
#OK
    hello.exe
#OK
    hello1.exe

clean:
    rm *.o
    rm *.exe
    rm *.bc
1
nl ja de
Я не знаю, помогает ли это. На моем GNU/Linux он работает с -fobjc-runtime = gnustep. У меня есть gnustep-base, построенный с помощью --enable-objc-nonfragile-abi.
добавлено автор Fred Frith-MacDonald, источник
У меня есть оба; nm /usr/local/lib/libgnustep-base.so|grep NSConstantString | grep -i objc_class ==> 007019b0 D _OBJC_CLASS_NSConstantString 00773f84 B __objc_class_name_NSConstantString 006f0fb0 V __objc_class_ref_NSConstantString
добавлено автор Fred Frith-MacDonald, источник
Спасибо, Фред, я попробую это последнее
добавлено автор neohope, источник
Похоже, что символ NSConstantString в test.bc является «_OBJC_CLASS_NSConstantString», а символ gnustep-base-1_24.dll - «__objc_class_name_NSConstantString». llvm не может найти правильный символ.
добавлено автор neohope, источник

1 ответы

Вероятно, вам понадобится хотя бы одна жесткая статическая ссылка на символ в каждой DLL. В своем основном() попробуйте добавить [NSConstantString class]; (добавьте объявление, если необходимо).

Динамический компоновщик окон довольно активен в отношении не загрузки DLL без жесткой ссылки на символ. Это противоречит динамическому поиску Objective-C.

(Это предположение основано на опыте. Прошло десять лет с тех пор, как я сделал ObjC в Windows, но, похоже, немного изменилось).

0
добавлено
OK - похоже, что компоновщик или компилятор генерирует код, который все еще слабо ссылается на классы. Найдите экспортированный символ функции из библиотеки и настройте код, который его вызывает (фактически не нужно выполнять, но убедитесь, что оптимизатор не устранит его). BTW: Мы все должны были играть в эти игры при разработке приложений WebObjects в Windows NT.
добавлено автор bbum, источник
Спасибо, bbum, я попробую это последнее
добавлено автор neohope, источник
NSConstantString является слабым реф. Не знаю, как с этим справиться. Возможно, мне нужно построить gnustep на окнах. [366] (sec 0) (fl 0x00) (ty 0) (scl 105) (nx 1) 0x00000000 __OBJC_CLASS_NSConstantString AUX lnno 2 размер 0x0 tagndx 368 [368] (сек -1) ( fl 0x00) (ty 0) (scl 2) (nx 0) 0x00000000 .weak .__ OBJC_CLASS_NSConstantString.default
добавлено автор neohope, источник