gpt4 book ai didi

c - 构建可执行文件时涉及 .so 库时未定义的错误引用

转载 作者:行者123 更新时间:2023-12-01 12:03:24 24 4
gpt4 key购买 nike

我有一个 .so 库,在构建它时我没有收到任何 undefined reference 错误。但现在我正在使用 .so 文件构建可执行文件,并且我可以在链接阶段看到 undefined reference 错误,如下所示:

xy.so: undefined reference to `MICRO_TO_NANO_ULL'

我提到了thisthis但无法真正理解动态链接。

同时阅读 here导致更多困惑:

Dynamic linking is accomplished by placing the name of a sharable library in the executable image. Actual linking with the library routines does not occur until the image is run, when both the executable and the library are placed in memory. An advantage of dynamic linking is that multiple programs can share a single copy of the library.

我的问题是:

  • 动态链接不是意味着当我使用以下命令启动可执行文件时./executable_name 如果链接器无法找到 .so哪个可执行文件依赖它才会崩溃?

  • 如果所有外部实体引用都是动态链接,那么实际上什么是动态链接?构建时解决?它是由动态链接器执行的某种预检查吗?别的动态链接器可以利用LD_LIBRARY_PATH 获取额外的库来解决未定义的问题符号。

最佳答案

Doesn't dynamic linking means that when I start the executable using ./executable_name then if the linker not able to locate the .so file on which executable depends it should crash?

不,链接器将退出并显示“没有这样的文件或目录”消息。

想象一下这样的情况:

  • 您的可执行文件在某处存储了它所需的共享库列表。
  • 链接器,将其视为普通程序。
  • 链接器打开您的可执行文件。
  • 链接器读取此列表。对于每个文件。
    • 它尝试在链接器路径中查找此文件。
    • 如果找到该文件,则会“加载”该文件。
    • 如果找不到该文件,则会从 open() 调用中获取 errnoNo Such file or directory 。然后打印一条消息,指出找不到该库并终止您的可执行文件。
  • 运行可执行文件时,链接器动态搜索共享库中的符号。
    • 当它找不到符号时,它会打印一些消息并且可执行文件终止。

例如,您可以设置LD_DEBUG=all来检查链接器正在做什么。您还可以在 strace 下检查可执行文件以查看所有 open 调用。

What actually is dynamic linking if all external entity references are resolved while building?

动态链接是指当您运行可执行文件时,链接器会加载每个共享库。

在构建时,您的编译器会很友好地为您检查,您在程序中使用的所有符号是否都存在于共享库中。这只是为了安全。例如,您可以使用 ex 禁用此检查。 --unresolved-symbols=ignore-in-shared-libs

Is it some sort of pre-check performed by dynamic linker?

是的。

Else dynamic linker can make use of LD_LIBRARY_PATH to get additional libraries to resolve the undefined symbols.

LD_LIBRARY_PATH 只是一个逗号分隔的搜索共享库的路径列表。 LD_LIBRARY_PATH 中的路径仅在标准路径之前处理。就这样。它没有获得“附加库”,它获得了搜索库的附加路径 - 库保持不变。

关于c - 构建可执行文件时涉及 .so 库时未定义的错误引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59896021/

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