相关疑难解决方法(0)

连接子做什么?

我一直在想.我知道编译器会将您编写的代码转换为二进制文件,但链接器的作用是什么?对我来说,它们一直是个谜.

我粗略地理解'链接'是什么.当对库和框架的引用添加到二进制文件时.除此之外我什么都不懂.对我来说它"只是有效".我也理解动态链接的基础知识,但没有太深入.

有人可以解释这些条款吗?

c++ linker dynamic-linking

111
推荐指数
4
解决办法
5万
查看次数

用黄金取代ld - 有经验吗?

有人试过用gold而不是ld吗?

gold 承诺要快得多ld,所以它可能有助于加快大型C++应用程序的测试周期,但是它可以用作ld的替代品吗?

可以gcc/ g++直接打电话gold.?

有没有知道错误或问题?

虽然gold有一段时间是GNU binutils的一部分,但我发现Web上几乎没有"成功案例"甚至"Howtos".

(更新:添加了黄金和博客条目的链接解释它)

c c++ migration linker gold-linker

79
推荐指数
6
解决办法
4万
查看次数

什么是GNU链接器中的部分链接?

我能找到的最佳解释来自官方文件:

-r --relocateable生成可重定位输出 - 即生成一个输出文件,该输出文件又可以作为ld的输入.这通常称为部分链接.作为副作用,在支持标准Unix幻数的环境中,此选项还将输出文件的幻数设置为OMAGIC.如果未指定此选项,则会生成绝对文件.链接C++程序时,此选项不会解析对构造函数的引用; 要做到这一点,请使用-Ur.此选项与`-i'的作用相同.

我特别想知道链接器输入中出现的符号会发生什么.当我有一个包含单个目标文件component.o的静态库libstatic.a时,请考虑具体情况.现在,我想创建另一个静态库libfinal.a,它将作为libstatic.a的接口.我用这个命令来创建它:

ld -r -o libfinal.a wrapper.o -L. -lstatic

其中wrapper.o提供了独有的API来调用libstatic.a中定义的函数

请问libfinal.a将只具有合并的归档文件wrapper.ocomponent.o或可待解决的所有引用wrapper.ocomponent.o来解决(连接),然后放入libfinal.a

Edit_1:根据所取得的进展更新问题:组件库()的objdump分别显示每个函数的部分(如预期的那样).在组合库中,由部分链接(flag)创建的只有一个部分.我想这意味着内部链接已经发生,而且不仅仅是创建一个普通的存档.libstatic.aobjdump -D libstatic.a.textlibfinal.a-r.text

c linker

13
推荐指数
2
解决办法
4763
查看次数

Windows:使用C++获取函数地址

我正在尝试使用memcpy获取函数地址以将其内容复制到缓冲区中.

我遇到的问题是获取功能地址.这是我的代码:

__declspec(noinline) int gio()
{
    const char yle[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    return 7;
}

int main(int argc, TCHAR* argv[])
{
    int(*funcptr)() = gio;
    unsigned char *p = (unsigned char *)&funcptr;
    size_t ik;

    for (ik = 0; ik < sizeof funcptr; ik++)
    {
        printf("%02x ", p[ik]);
    }
    putchar('\n');

    printf("gio x -> %x\n", gio);
    printf("gio p -> %p\n", gio);
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个小测试程序,我尝试以不同的方式打印函数地址.

我正在使用Visual Studio并关闭了优化和内联函数扩展(但无论如何都使用了无内联).所有的打印语句都打印相同的输出(0x00d213ca 截图),但是当我把光标(在VS内)放在gio功能上时,它显示完全不同的地址(0x00d218c0 截图).

当我右键单击gio功能时,Go To Dissasembler我跳到我把光标放在它上面时显示的地址(0x00d218c0 截图).这清楚地表明了这个功能的真正含义.

我在这里有点困惑,似乎我不明白的东西.

为什么print语句显示不正确的值?获取"真实"功能地址的方法是什么?

c++ windows pointers function

7
推荐指数
1
解决办法
964
查看次数

解决部分链接中的相对重定位

我注意到使用-r部分链接实际上并没有解决任何重定位问题,即使它们可以通过相对寻址解决。例如,考虑f.og.of.of()这就要求g()g.o。在链接之前,拆卸和重定位按预期进行。然而,在部分链接到一个新文件h.o(通过ld -r -o h.o f.o g.o)之后,仍然存在对调用的重定位g(),即使理论上它可以用相对地址解析。

这是h.o( objdump -d h.o)的反汇编,包含f()g()。您可以看到对 的调用g()仍未解决:

h.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:       55                      push   %rbp
   1:       48 89 e5                mov    %rsp,%rbp
   4:       e8 00 00 00 00          callq  9 <f+0x9>
   9:       90                      nop
   a:       5d                      pop    %rbp
   b:       c3                      retq

000000000000000c …
Run Code Online (Sandbox Code Playgroud)

linux relocation ld

6
推荐指数
1
解决办法
481
查看次数

为什么在调试中禁用增量链接?

在 MS Visual C++ 2008 中,是否有任何理由在调试版本中禁用增量链接?

从我有限的阅读启用增量构建让我更快地链接和编辑 & 继续。

我不知道你为什么要禁用这个伟大的功能。什么是缺点?是片状的吗?

编辑: 我正在使用一个包含多个项目的解决方案(少数 dll 链接到几个 exe),并且大多数(但不是全部)在调试中禁用了增量链接。

c++ visual-studio-2008

5
推荐指数
1
解决办法
2766
查看次数