Mac:如何从可执行文件导出符号?

我正在编写一个使用dlopen()(Windows上的LoadLibrary())来动态加载共享库的可执行文件。 共享库使用可执行文件中的符号。

在Windows中,这是可能的。 可执行文件可以导出符号:declspec(dllexport)和.def文件都可以使用。 链接器在创建.exe时还会创建.lib文件(“导入库”),因此该DLL只需与该.lib链接即可。

在Linux中,这也是可能的。 构建可执行文件时,我传递-Wl,-export_dynamic,以便导出它的符号。

在Mac OS X上,相反... -Wl,-export_dynamic不起作用,但有-Wl,-exported_symbols_list, <filename>其中<filename>是要导出的符号列表(一种简单版本的.def文件)。 但是,建立共享库并不容易:链接器抱怨未解决的符号。

我尝试了一种方法:将可执行文件重命名为lib <executable> .dylib,并且在链接共享库时,我传递了-l <executable> 。 但它给出的错误“无法与主可执行文件链接”。

一般的问题是Linux共享库可能有未解决的符号,而Windows和Mac OS X不允许它。 但Windows具有“导入库”来解决符号依赖问题,而Mac OS X显然不会......

这怎么能在Mac OS X上解决? 是否有相当于一个“导入库”(创建.dll时由Windows链接器创建的存根库,因此,如果有任何模块需要动态链接到.dll,它与“导入库”链接)? 或者其他解决方案?


独立的Lua解释器支持动态加载(通过dlopen)使用可执行文件(Lua API)中的符号的共享库。 构建时不使用特殊链接标志。 共享库是使用这种咒语构建的:

env MACOSX_DEPLOYMENT_TARGET=10.3 gcc -bundle -undefined dynamic_lookup -o random.so lrandom.o

谢谢你,你的回答激发了研究bundle和dylib之间区别的愿望。 而ld的手册页提到了一个名为-bundle_loader的选项

-bundle_loader可执行文件
这指定将加载正在链接的包输出文件的可执行文件。 根据指定的可执行文件检查包中未定义的符号,就像它是捆绑链接的动态库之一一样。

(请注意,构建dylib时,-bundle_loader失败,它仅适用于捆绑包)因此,旧命令行

cc -shared -o <output>.so <input>.c

变成了

cc -bundle -bundle_loader <executable> -o <output>.so <input>.c

并且输出包针对可执行文件解析了未定义的符号。

链接地址: http://www.djcxy.com/p/53295.html

上一篇: Mac: How to export symbols from an executable?

下一篇: Force linker to export a resolved symbol when creating shared library