如何解决系统和库依赖项之间的 C++ 冲突
How to solve C++ conflicts between system and library dependencies
我的问题比较具体,请耐心等待。
这到底是有点逆向工程,但这个问题似乎更适合这个板。
所以,我有一个用 C++ 编写的为 MIPS 编译的共享对象。我没有lib的源代码。该库是使用 GCC
4.3.3 编译的。我想在我的 amd64 计算机 运行 elementary OS 中使用此共享对象中的函数。为此,我使用 sourcery 交叉编译器将一些 C++ 代码交叉编译为 MIPS,这将使用该对象。
到目前为止,除了这个我无法弄清楚的编译错误外,我已经解决了这个问题。该库称为 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 依赖项以及它们出现的顺序。
对此有什么想法吗?
感谢大家的帮助。
虽然使用 -nodefaultlibs
解决了第一个问题。
您link反对 GLIBC (libc.so.6
) 和 其他一些 libc (libc.so.0
)。
那 永远不会 工作:你必须编译所有内容并 linked 针对 单个 , 一致 libc.
由于您的 libdvl.so
用作依赖项 libc.so.0
,并且假设您无法重建 libdvl.so
,您 必须 使用交叉编译器目标 libc.so.0
(可能是 dietlibc 或 uClibc),并使用该工具链编译和 link 其他所有内容。另一方面,您的交叉编译器似乎以 GLIBC 为目标,对您没有任何好处。
经过大量试验和错误后,您可能能够 link 使用不一致构建的最终二进制文件,并且您的二进制文件甚至可能达到 main
(这不太可能)。但是这种二进制文件真正正常工作的可能性很小。
我的问题比较具体,请耐心等待。 这到底是有点逆向工程,但这个问题似乎更适合这个板。
所以,我有一个用 C++ 编写的为 MIPS 编译的共享对象。我没有lib的源代码。该库是使用 GCC
4.3.3 编译的。我想在我的 amd64 计算机 运行 elementary OS 中使用此共享对象中的函数。为此,我使用 sourcery 交叉编译器将一些 C++ 代码交叉编译为 MIPS,这将使用该对象。
到目前为止,除了这个我无法弄清楚的编译错误外,我已经解决了这个问题。该库称为 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 依赖项以及它们出现的顺序。 对此有什么想法吗?
感谢大家的帮助。
虽然使用 -nodefaultlibs
解决了第一个问题。
您link反对 GLIBC (libc.so.6
) 和 其他一些 libc (libc.so.0
)。
那 永远不会 工作:你必须编译所有内容并 linked 针对 单个 , 一致 libc.
由于您的 libdvl.so
用作依赖项 libc.so.0
,并且假设您无法重建 libdvl.so
,您 必须 使用交叉编译器目标 libc.so.0
(可能是 dietlibc 或 uClibc),并使用该工具链编译和 link 其他所有内容。另一方面,您的交叉编译器似乎以 GLIBC 为目标,对您没有任何好处。
经过大量试验和错误后,您可能能够 link 使用不一致构建的最终二进制文件,并且您的二进制文件甚至可能达到 main
(这不太可能)。但是这种二进制文件真正正常工作的可能性很小。