如何解决系统和库依赖关系之间的C ++冲突

时间:2015-03-19 20:04:17

标签: c++ g++ mips cross-compiling linkage

我的问题很具体,但请耐心等待。 这最终有点逆向工程,但这个问题似乎更适合这个板。

所以,我有一个用C ++编写的MIPS编译的共享对象。我没有lib的源代码。 lib使用GCC 4.3.3编译。我想在运行基本操作系统的amd64计算机中使用此共享对象中的函数。为此,我使用sourcery交叉编译器将一些C ++代码交叉编译为MIPS,这将使用此对象。

到目前为止,除了这个编译错误之外,我还是管理了这个,我无法弄明白。 lib被称为libdvl.so,并使用依赖libc.so.0(两者都与cpp代码位于同一文件夹中)。

mips-linux-gnu-g++ -g -L/path/to/lib -Wl,-rpath,/path/to/lib -o verifier verifier.cpp -ldvl

给了我

(...)/mgc/embedded/codebench/bin/../lib/gcc/mips-linux-gnu/4.9.1/../../../../mips-linux-gnu/bin/ld: warning: libc.so.0, needed by /path/to/lib/libdvl.so, may conflict with libc.so.6
(...)/mgc/embedded/codebench/bin/../lib/gcc/mips-linux-gnu/4.9.1/../../../../mips-linux-gnu/bin/ld: errno@@GLIBC_PRIVATE: TLS definition in (...)/mgc/embedded/codebench/bin/../mips-linux-gnu/libc/lib/libc.so.6 section .tbss mismatches non-TLS definition in /path/to/lib/libc.so.0 section .bss
/path/to/lib/libc.so.0: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

所以我添加了“-l:libc.so.0”并得到了这个

(...)/mgc/embedded/codebench/bin/../lib/gcc/mips-linux-gnu/4.9.1/../../../../mips-linux-gnu/bin/ld: errno: TLS definition in (...)/mgc/embedded/codebench/bin/../mips-linux-gnu/libc/lib/libc.so.6 section .tbss mismatches non-TLS definition in libc.so.0 section .bss
(...)/mgc/embedded/codebench/bin/../mips-linux-gnu/libc/lib/libc.so.6: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

知道如何解决这个问题吗?我知道我正在使用GCC 4.9.1,但我已经下载了使用GCC 4.3.154的旧代码源代码版本并得到了完全相同的错误。

编辑1:正如Lol4t0所述,使用c ++ filt进行过滤后,它会从stdc ++中提供实际的函数名称。使用

mips-linux-gnu-g++ -g -L/path/to/lib -Wl,-rpath,/path/to/lib -I/path/to/lib -o verifier verifier.cpp -ldvl -l:libuClibc++.so.0 -l:libutil.so.0 -l:libc.so.0 -l:ld-uClibc.so.0 -nodefaultlibs

给libdvl它的依赖(因为我不会重写stdc ++:p),我得到以下编译错误:

(...)/mgc/embedded/codebench/bin/../lib/gcc/mips-linux-gnu/4.9.1/../../../../mips-linux-gnu/bin/ld: /tmp/cc66DLda.o: undefined reference to symbol '_Unwind_Resume@@GCC_3.0'
(...)/mgc/embedded/codebench/bin/../mips-linux-gnu/libc/lib/libgcc_s.so.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

我已经确认了lib依赖项及其出现的顺序。 有什么想法吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用-nodefaultlibs解决了第一个问题。

答案 1 :(得分:0)

您正在链接GLIBC(libc.so.6其他一些libc(libc.so.0)。

永远不会工作:你必须将所有内容编译并链接到一致 libc。

由于您的libdvl.so使用依赖libc.so.0,并且假设您无法重建libdvl.so,您必须使用针对{{1}的交叉编译器(可能是dietlibc,或uClibc),并使用该工具链编译和链接其他所有内容。另一方面,您的交叉编译器似乎以GLIBC为目标,对您没有任何好处。

经过大量的反复试验,您可能能够使用不一致的构建链接最终的二进制文件,而您的二进制文件甚至可能会达到libc.so.0(这是非常不可能的)。但是这种二进制文件实际上正常工作的可能性微乎其微。