【问题标题】:How to load dll or lib files in LLVM?如何在 LLVM 中加载 dll 或 lib 文件?
【发布时间】:2012-12-28 10:23:53
【问题描述】:

我是 LLVM 新手。我昨天通过 GnuStep 在 windows 上构建了 LLVM 和 Clang。

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

我可以将 Objective-c 源文​​件编译为 bitcode 和 exe。 exe 可以运行,但是当我尝试执行 bitcode 时,出现此错误:

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?

你好.m

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

生成文件

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

【问题讨论】:

  • 我不知道这是否有帮助。在我的 GNU/Linux 上,它与 -fobjc-runtime=gnustep 一起工作。我用 --enable-objc-nonfragile-abi 构建了 gnustep-base。
  • 谢谢 Fred,我稍后再试试
  • 看来,test.bc 中 NSConstantString 的符号是“_OBJC_CLASS_NSConstantString”,而 gnustep-base-1_24.dll 中的符号是“__objc_class_name_NSConstantString”。 llvm 找不到正确的符号。
  • 我的两者都有; 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

标签: objective-c llvm gnustep


【解决方案1】:

您可能需要对每个 DLL 中的符号至少有一个硬的、静态的引用。在您的 main() 中,尝试添加 [NSConstantString class];(如果需要,添加声明)。

Windows 动态链接器非常主动地不加载没有硬符号引用的 DLL。这与 Objective-C 的动态查找冲突。

(这是基于经验的猜测。自从我在 Windows 上完成 ObjC 以来已经有十年了,但似乎变化不大。)

【讨论】:

  • 谢谢bbum,我以后试试
  • NSConstantString 是一个弱引用。不知道如何处理它。也许我必须在 Windows 上构建 gnustep。[366](sec 0)(fl 0x00)(ty 0)(scl 105) (nx 1) 0x00000000 __OBJC_CLASS_NSConstantString AUX lnno 2 大小 0x0 tagndx 368 [368](sec -1)( fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 .weak.__OBJC_CLASS_NSConstantString.default
  • OK - 听起来链接器或编译器正在生成仍然弱引用类的代码。从库中找到一个导出的函数符号并设置一些调用它的代码(不必实际执行,但要确保优化器不会消除它)。顺便说一句:在 Windows NT 上开发 WebObjects 应用程序时,我们都必须玩这类游戏。
猜你喜欢
  • 2013-12-09
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
相关资源
最近更新 更多