问题标签 [ld]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
34463 浏览

macos - ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库

当我尝试构建以下程序时:

在 OS X 10.6.4 上,具有以下标志:

它返回这个:

有没有其他人遇到过这种情况,还是其他人没有受到影响?有什么修复吗?

谢谢

0 投票
1 回答
1269 浏览

assembly - 32 位 Linux 程序集 - 将文件链接在一起(gas 和 ld)

我写了一个叫做 strlen 的函数:

我是这样组装的:

然后我在 asm 中编写了一个程序来打印我想与之链接的 argv。我用同样的方法组装。现在我想将它们链接在一起,以便实际程序可以使用 strlen。我试过了:

但这会产生:

我一定错过了一些非常简单的东西。谢谢!

0 投票
2 回答
3808 浏览

macos - Mac:如何从可执行文件中导出符号?

我正在编写一个可执行文件,它使用 dlopen()(Windows 上的 LoadLibrary())来动态加载共享库。共享库使用可执行文件中的符号。

在 Windows 中这是可能的。可执行文件可以导出符号:declspec(dllexport) 和 .def 文件都可以。链接器在创建 .exe 时也会创建 .lib 文件(“导入库”),因此 DLL 只需与该 .lib 链接即可。

在 Linux 中,这也是可能的。我在构建可执行文件时通过 -Wl,-export_dynamic 以便导出其符号。

相反,在 Mac OS X 上... -Wl,-export_dynamic 不起作用,但有 -Wl,-exported_symbols_list,<filename>其中<filename>是要导出的符号列表(一种更简单的 .def 文件版本)。但是,构建共享库并不容易:链接器抱怨未解析的符号。

我尝试了一个技巧:将可执行文件重命名为 lib <executable>.dylib ,并且在链接共享库时,我通过了 -l <executable>。但它给出了错误“无法与主可执行文件链接”。

一般的问题是 Linux 共享库可以有未解析的符号,而 Windows 和 Mac OS X 不允许。但是 Windows 有“导入库”来解决依赖关系的符号,而 Mac OS X 显然没有......

如何在 Mac OS X 上解决这个问题?是否有等效的“导入库”(Windows 链接器在创建 .dll 时创建的存根库,因此,如果任何模块需要动态链接到 .dll,则它与“导入库”链接)?还是其他解决方案?

0 投票
2 回答
7267 浏览

linux - 在 Linux 上使用 gcc 进行增量链接。是否可以?

我团队项目的开发方式是,我们从所有.o对象文件中为我们的应用程序生成一个共享对象库。我的任务(希望它足够具体,但也足够通用以对其他人有用!)是仅链接自上次创建可执行文件以来已更改的目标文件。例如,这是我用来构建 .so 的命令行:

哪个按预期工作!:) 我的目标是从现在开始只能链接更改的目标文件,以加快并发链接过程。一个示例命令是:

这将libMySharedLibrary.so使用较新的目标文件进行更新,同时还保留较旧的目标文件libMySharedLibrary.so。实际上,当我libMySharedLibrary.so使用上面的命令生成时,文件大小比包含所有目标文件时的文件大小要小得多,所以我几乎可以肯定上面的命令没有做我想要的。

通过我的研究,我发现-i链接器有一个选项与-r选项相同,它似乎也只是将所有目标文件组合成一个大目标文件。不幸的是,这似乎不是我想要的。

简而言之,我只想在初始链接之后链接更改的目标文件,从而为将来的链接提供更快的链接过程。有没有办法做到这一点?

编辑:我尝试过的一个例子-i/-r

示例命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

我必须添加-nostdlib标签以阻止它对我大喊大叫需要它,并删除,-shared因为标签不允许共享对象-r

这个命令似乎将我所有的 .o 文件都塞进一个大的 .o 文件中。因此,如果我可以从现在开始仅使用已更改的 .o 文件更新该 .o 文件,那就太好了。在最初创建 AllMyObjects.o 之后,我尝试了这个命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o,但它也会创建一个更小的 (file-size-wise) AllMyObjects.o,所以我假设它不可能拥有所有的目标文件。我觉得这是我可能会犯一个小错误的事情。有人有什么建议吗?提前致谢。

0 投票
4 回答
201806 浏览

gcc - LD_LIBRARY_PATH 与 LIBRARY_PATH

我正在构建一个简单的 C++ 程序,并且我想暂时将系统提供的共享库替换为更新版本的共享库,以进行开发和测试。

我尝试设置 LD_LIBRARY_PATH 变量,但链接器(ld)失败:

/usr/bin/ld: 找不到 -lyaml-cpp

我希望这可以工作,因为根据 ld 手册页:

链接器使用以下搜索路径来定位所需的共享库: ... 对于本机链接器,环境变量“LD_LIBRARY_PATH”的内容...

然后我尝试设置 LIBRARY_PATH,并且成功了。

根据 GCC 手册:

LIBRARY_PATH 的值是一个以冒号分隔的目录列表,很像 PATH。当配置为本地编译器时,如果使用 GCC_EXEC_PREFIX 找不到特定的链接器文件,GCC 会在搜索特殊链接器文件时尝试指定的目录。在为 -l 选项搜索普通库时,使用 GCC 进行链接也会使用这些目录(但首先使用 -L 指定的目录)。

正如(GCC)手册所建议的那样,LIBRARY_PATH 有效,因为我与 GCC 链接。

但..

  • 由于我与 gcc 链接,为什么 ld 被调用,如错误消息所示?
  • 让两个变量服务于同一目的有什么意义?还有其他区别吗?
0 投票
1 回答
1105 浏览

linker - 非.bss 未初始化数据段

我正在使用自定义链接器脚本将内核映像分成两部分。第一个是正常的代码和数据,第二个是初始化代码和不再需要时丢弃的数据。初始化部分也不像内核本身那样在地址空间之间共享,所以如果它仍然存在(它处于开发的早期阶段),那么任何东西都会被复制到 fork() 上。

我已经分配了一个小的内核堆栈以在启动时使用,但据我所知,我只能将它放在它在地址空间之间共享的 .bss 部分它不能存储为的 init 区域中未初始化的数据。我想将它作为未初始化的数据存储在图像的 init 部分中,以便每个进程都有自己的副本。

我可以想到两种可能的方法来做到这一点,但我无法确定它们是否可能,或者我将如何告诉链接器执行它们。第一种是将未初始化的区域放在非 .bss 部分中,但我不确定这是否可能——我认为您不能像这样混合部分。第二个是创建第二个类似.bss 的部分,它只存储未初始化的数据,我可以将其放入链接描述文件的初始化部分中。

有任何想法吗?为了完整起见,这是我正在使用的链接器脚本:

0 投票
2 回答
838 浏览

macos - 有关 gdb 内存访问投诉的详细信息

我有一个使用as编译的目标文件(来自汇编代码)。

如果我使用ld链接它,当我尝试stepi(或nexti)时,gdb 会抱怨地址 0x0 的内存访问。如果我使用gcc链接它,一切都很好。

我猜这个问题是由ld引起的,与gcc的链接结果相比,它产生的部分更少。

有没有办法将 gdb 配置得更详细,这样我就可以找出可执行文件出了什么问题?

PS:可执行文件本身在两个版本中都按预期运行。

稍后编辑:我用来编译的命令:

0 投票
1 回答
366 浏览

linux - 使用 LD 将原始数据/资源链接到可执行文件

到目前为止,我一直使用 MSVC++ 下的资源来从我的程序内部访问原始数据,而且我从未直接使用过链接器,但现在我在 Linux 下,我正在使用交叉编译器来生成精灵文件。我和一个朋友正在开发一个玩具操作系统。

在某个时候我们需要完成的一件事是将相当大的任意原始数据链接到可执行文件中。我们希望数据位于可执行文件的末尾附近,并且还需要能够获得指向该原始数据的指针。可能值得注意的是,GRUB 在引导时将内核加载到内存中。

我们之前的一个想法是编写一个程序来将数据转换为一个 C 源文件,其中数据表示为一个字节数组,但我们认为这有点混乱,我们宁愿直接链接它。

有什么见解吗?我不需要令人毛骨悚然的细节,只需要对需要做什么的广泛概述。我认为我们可能必须对链接描述文件进行一些更改。

0 投票
2 回答
1976 浏览

c++ - 在 omnetpp 中构建我自己的模块时出现问题

我正在尝试使用 omnetpp 的 inetmanet 框架中包含的 UDP 模块编写应用程序。问题是我必须包含的文件没有包含在链接阶段。

错误是:

opp_makemake

制作

我真的不知道为什么它们被包含在内,并且我的模块编译得很好,但是在链接阶段我得到“未定义的引用”。

任何的想法?

0 投票
3 回答
6222 浏览

c++ - Linux 上的 Lua C++ 开发文件(/usr/bin/ld: 找不到 -llua5.1)

我正在构建一个嵌入 Lua 脚本引擎的 C++ 应用程序。我正在Linux(Ubuntu)上开发。

我已经在我的开发机器上安装了 Lua(通过安装 lua5.1 包)。我可以成功运行 Lua 解释器(通过 cmd 行)。

但是,在构建时,我收到以下链接错误:

/usr/bin/ld: 找不到 -llua5.1

我搜索了 Ubuntu 论坛/软件包存储库等,但似乎找不到所需的软件包。任何人都可以帮忙吗?

PS:我还需要安装 tolua++ 的开发文件(我也不确定哪个 Ubuntu 包是必需的)。

我在 Ubuntu 10.0.4