ld(链接器或加载器)程序将目标文件,归档文件和(参考)共享库组合在一起,将其数据和地址与符号引用一起重定位。链接通常是编译程序的最后一步。
`gcc-undef`导致`找不到entry符号_start`;默认为x
当运行gcc -undef file.c上,在包含主要功能的文件上,我会从ld中获得此警告: /usr/bin/ld:警告:找不到条目符号_start;默认为0000000000401020 ...
黄金国家的人: -l dir, - library-Path dir 将目录添加到搜索路径 - -RPATH-LINK DIR 添加DIR到链接时间共享库搜索路径 BFD LD的男人制造...
在 Debian 12 上使用 GNU ld 链接 libvulkan(未定义参考)的问题
我想用Vulkan学习编程。我的第一步是枚举系统上可用的 Vulkan 扩展数量。所以我写了这个简单的代码: #包括 #包括 我想用 Vulkan 学习编程。我的第一步是枚举系统上可用的 Vulkan 扩展数量。所以我写了这个简单的代码: #include <iostream> #include <vulkan/vulkan.hpp> int main(int argc, char *argv[]) { VkResult ret; unsigned int propertyCount; ret = vkEnumerateInstanceExtensionProperties(NULL, &propertyCount, NULL); if (ret != VK_SUCCESS) return 1; std::cout << "Vulkan: Extension Count: " << propertyCount << std::endl; return 0; } 当我尝试编译和链接代码时,出现 undefined reference 错误: $ g++ -lvulkan -o vkExtension vkExtension.cpp /usr/bin/ld: /tmp/user/1000/ccgB9M9N.o: in function `main': vkExtension.cpp:(.text+0xc99): undefined reference to `vkEnumerateInstanceExtensionProperties' collect2: error: ld returned 1 exit status $ 虽然 libvulkan 安装在我的系统上(Debian 12): $ cd /usr/lib/x86_64-linux-gnu $ ls -la | grep libvulkan -rw-r--r-- 1 root root 8575696 Mar 22 2023 libvulkan_intel_hasvk.so -rw-r--r-- 1 root root 11115728 Mar 22 2023 libvulkan_intel.so -rw-r--r-- 1 root root 6918024 Mar 22 2023 libvulkan_lvp.so -rw-r--r-- 1 root root 8711344 Mar 22 2023 libvulkan_radeon.so lrwxrwxrwx 1 root root 14 Feb 6 2023 libvulkan.so -> libvulkan.so.1 lrwxrwxrwx 1 root root 20 Feb 6 2023 libvulkan.so.1 -> libvulkan.so.1.3.239 -rw-r--r-- 1 root root 457224 Feb 6 2023 libvulkan.so.1.3.239 $ 我也检查了库本身是否缺少功能(符号),但应该在已安装的库中可用。命令 nm 不会列出任何符号,因为库已被删除。所以我用了readelf: $ readelf -s --wide libvulkan.so.1.3.239 | grep vkEnumerateInstance 136: 0000000000034850 687 FUNC GLOBAL DEFAULT 12 vkEnumerateInstanceExtensionProperties 170: 0000000000034b00 639 FUNC GLOBAL DEFAULT 12 vkEnumerateInstanceLayerProperties 283: 0000000000034d80 709 FUNC GLOBAL DEFAULT 12 vkEnumerateInstanceVersion $ 我还检查了链接器(GNU ld)的默认库搜索路径,但路径是正确的。 缺少什么? (SO上也有类似的问题。但不幸的是没有答案。) 更新 似乎问题与GNU GCC/ld相关。尝试使用 clang++/LLVM 构建代码,成功了: $ clang++ -Wall -Wextra -lvulkan -o vkExtension vkExtension.cpp vkExtension.cpp:5:14: warning: unused parameter 'argc' [-Wunused-parameter] int main(int argc, char *argv[]) ^ vkExtension.cpp:5:26: warning: unused parameter 'argv' [-Wunused-parameter] int main(int argc, char *argv[]) ^ 2 warnings generated. $ ./vkExtension Vulkan: Extension Count: 20 $ 也更新了问题标题。 我已经解决了这个问题。这是我的第 8 层(使用)问题。 链接参数的库必须在带有GCC/G++的源之后,当然,不能在之前: $ g++ -o vkExtension vkExtension.cpp -lvulkan 完全忘记了GCC/G++的这种行为。抱歉,其他 SO 用户浪费了您的时间。
TL;DR - 我需要用 test.o 编译 archive.a 以生成可执行文件。 背景 - 我试图从我正在修改的软件包中调用一个单独的库中的函数,但该函数(...
我正在尝试编译 zimg 作为 Debian 11 上其他一些软件的先决条件。由于所需的最低版本比 apt 提供的最新版本更新,我别无选择,只能编译...
当我尝试与 LD 链接时,Windows 版 MinGW 无法工作
我现在正在用 C 语言开发一个测试操作系统...并且我一直在查看 http://www.osdever.net/tutorials/view/brans-kernel-development-tutorial 来开始。我获得了 Windows 7(64 位)的 MinGW。我看...
GCC:- 在 Linux 上链接库以创建 so 文件时无法找到 libpthread_nonshared.a 文件
嗨,我正在尝试在 Ubuntu 20.04 中使用 gcc 10.2 编译一个 c 项目。 但最后它给了我如下错误 /usr/bin/ld: 找不到 /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a 收集2:错误...
我正在使用PocketDOS来模拟ELKS,但我想使用gcc和ld对其进行开发,我该怎么做?
我有一个应用程序,我想使用 Linux 提供的 rtld-audit 接口来挂钩共享库加载过程。如果我使用 LD_AUDIT 环境变量来电话,这会非常有用...
我想知道为什么 g++ test1.o test2.o -o test.x -lgtk-x11-2.0 有效,同时 ld'r test1.o test2.o -o test.o -lgtk-x11-2.0 给出: ld:找不到-lgtk-x11-2.0 除非我明确包括...
为什么 .data.rel.ro 部分在我的可执行文件中占用如此多的空间?
我想在Linux上构建一个共享库,其中包含一个大的初始化数组,并在不同的可执行文件中使用该数组。 我希望这可以减少编译输出的大小,特别是......
如何找出在 Ubuntu 22.04 上使用 GCC 11 构建时 gcc 无法链接我的库(仅使用 lib 构造函数)的原因? 我在这里设置了一个小例子来尝试复制问题:https://
为什么 GNU `ld` 使用等效源与 NASM 和 GAS `.o` 文件有不同的输出?
在受许多关于小型 ELF 可执行文件的有趣文章启发进行一些实验时,我注意到 GNU 的 ld 在输入 nasm 生成的 .o 目标文件或 w...
crtbegin.o、crtbeginT.o 和 crtbeginS.o 有什么区别?
我正在尝试使用 ld 直接链接来隔离构建问题。 当我包含 /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so 时,我遇到了一些问题: ac-aaa.o:在函数`
通常,用户程序二进制文件将加载到程序地址空间的低地址(通常在 0x400000 左右),该地址空间将在 elf 二进制文件中指定(在 Linux 的情况下)。 我们可以...
我制作了一个 nasm 程序集 hello world 程序,如下所示: 全局启动 节.文本 开始: 莫夫拉克斯,0x20000004 莫夫RDI,1 lea rsi,[相关消息] mov rdx, msg.len 系统调用 我...
我有一个目标文件,其中有一堆我不关心的编译器生成的部分。当我使用链接器脚本将平面二进制文件链接在一起时,我有时可以看到这些部分放置在...