gpt4 book ai didi

c - 如何使用 ld 检测链接中的歧义

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:41 27 4
gpt4 key购买 nike

我们遇到了一个花了一周时间才解决的问题。这是因为在 Fortran 程序(在静态 .a 存档中)和 C 程序(在 .so 动态库中)中声明了函数“ddot”。链接器“ld”链接到错误的条目。

事实证明,将 fortran 函数从“ddot”重命名为“ddot_sparse”后问题就解决了。但我们花了一个星期才找到它。

是否可以自动进行这种检测?事实上,链接器接受来自 Fortran 的“ddot”和来自 C 库的“ddot”是合法的。这可以由链接器报告吗?

或者可能是“ld”的一个错误,没有检测到这些东西? ld 的手册页说“通常当一个符号被多次定义时,链接器会报告一个 fatal error 。”这显然没有发生在这里。

或者,是否有工具可以显示二进制可执行文件的各种符号之间的依赖关系树?那将非常有用。为每个符号显示所使用的符号及其来源的文件。

最佳答案

默认情况下,ld 应该以先到先得的方式链接。例如

ld main.o -lfortran_archive -ldynamic_library

将首先链接到 libfortran_archive.a 中的任何符号,然后将其余符号链接(symbolic link)到 libdynamic_library.so。如果你交换链接顺序

ld main.o -ldynamic_library -lfortran_archive

那么你就会有相反的效果。这将使您能够确定哪个库具有优先符号。

我不知道有一个通用开关可以让您在 ld 中对多个符号输出警告。特别是那个例如Linux 和 OS X 带有不同的链接器。但是您可以使用 nm 输出目标文件/库中定义的所有符号的列表

cat <(nm -U libfortran_archive.a) <(nm -U libdynamic_library.so) \
| grep -o "[^ ]*$" | sort | uniq -c | grep -v "\s*1"

关于c - 如何使用 ld 检测链接中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com