makefile - 将 Autotooled 项目编译为 LLVM 位代码时出现链接器错误

标签 makefile linker llvm gnu-coreutils gold-linker

我按照 http://gbalats.github.io/2015/12/10/compiling-autotooled-projects-to-LLVM-bitcode.html#compiling-llvm-from-source-with-gold-plugin 上的说明进行操作尝试将各种项目(包括 coreutils)编译为 LLVM IR。

我尝试使用 Clang 3.4 和一个简单的测试文件在 Ubuntu 14.04 上测试我的安装

clang -flto -fuse-ld=gold -Wl,-plugin-opt=also-emit-llvm test.o

如上所述,但失败了

test.o: file not recognized: File format not recognized
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但是,添加参数-B/usr/lib/gold-ld后,我可以编译测试文件。

仍然,编译 coreutils 失败并出现以下错误:

/usr/lib/gold-ld/ld: error: src/libver.a: no archive symbol table (run ranlib)
/usr/lib/gold-ld/ld: error: lib/libcoreutils.a: no archive symbol table (run ranlib)
/usr/lib/gold-ld/ld: error: lib/libcoreutils.a: no archive symbol table (run ranlib)
/tmp/lto-llvm-dc31af.o:ld-temp.o:function usage: error: undefined reference to 'program_name'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function usage: error: undefined reference to 'quote'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function usage: error: undefined reference to 'program_name'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'set_program_name'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'exit_failure'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'close_stdout'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'parse_user_spec'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'xgetgroups'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'quote'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'parse_user_spec'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'xgetgroups'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'quote'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'Version'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'version_etc'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function main: error: undefined reference to 'quote'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function parse_additional_groups: error: undefined reference to 'xstrdup'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function parse_additional_groups: error: undefined reference to 'xstrtoul'
/tmp/lto-llvm-dc31af.o:ld-temp.o:function parse_additional_groups: error: undefined reference to 'x2nrealloc'

最后执行的命令是:

clang -flto -B/usr/lib/gold-ld  -Wl,--as-needed -flto  -B/usr/lib/gold-ld -fuse-ld=gold -Wl,-plugin-opt=also-emit-llvm  -o src/chroot src/chroot.o src/libver.a lib/libcoreutils.a  lib/libcoreutils.a 

在 libver.a 和 libcoreutils.a 上手动执行 llvm-ranlib 不会改变结果。执行 llvm-nm -s src/libver.a 会打印以下内容:

 D Version

但是,正常构建的输出如下:

Archive map
Version in version.o

version.o:
00000000 D Version

llvm-ranlib有问题吗?您对如何修复链接器错误有什么建议吗?

最佳答案

您尝试过 onlu ranlib 吗?您需要 llvm-ar(设置 (CMAKE_AR llvm-ar)),可能还需要 llvm-nm。 llvm-ar 而不是 ar 对我来说效果很好。

关于makefile - 将 Autotooled 项目编译为 LLVM 位代码时出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34358976/

相关文章:

build - bmake的优点

memory - 中断向量中中断处理程序的地址为实际地址的+1

c++ - 在公共(public)目标文件中分隔调用者

c++ - dev c++ 中的链接器错误

makefile - 如何使创建的包在 make menuconfig 上可用?

c++ - Makefile 不使用包含/库路径?

c - 运行时检查 LeakSanitizer (detect_leaks=1)

指定 lambda 捕获时出现 C++11 编译错误

mysql - 启用 CFI 编译 mysql

linux - 为什么在 omap 器件的 TI x-loader makefile 中使用 $$PWD 而不是 $PWD