循环依赖问题
假设可执行程序exe1使用了so1和so2中的函数,so1使用了so2的函数。编译so1时,肯定需要指定-lso2;编译exe1时,肯定需要指定-lso1,但是exe1间接依赖了so2,是否需要指定-lso2呢?
对于常规的NDK编译来说,是需要指定的,否则会报undefined reference问题。而如果添加LOCAL_LDFLAGS += -fuse-ld=gold.exe
选项,则可以解决这个问题。https://www.jianshu.com/p/21c5b79d5371文中提到使用-fuse-ld=gold
会报错,而解决方式是使用-fuse-ld=gold.exe
,虽然我没有遇到这个问题。在NDK中,ld.bfd.exe
和ld.gold.exe
都是有的。
gold
- 名字由来:go+ld
- 只能ELF格式专用,和ld一样,都属于GNU binutils
- goal:加快link速度。相比ld要快2~10倍,同时更少的内存消耗。为什么会比ld快呢?因为ld使用了BFD库以支持不同的文件格式,有更多的抽象层。而gold则直接针对ELF格式设计,所以有更快的速度。对比而讲,LLVM的lld是最快的,比gold更快
- https://blog.csdn.net/ayu_ag/article/details/78552801:这篇文章里讲的dt-needed的问题问题,在我的测试时不行,会报错说不支持这样的选项;同时其讲的循环依赖问题,从我这里来看是刚好相反的,即gold不会去解决循环依赖的符号。第四点,使用gold导致dlopen变慢的问题,还没有验证。