相关疑难解决方法(0)

@plt在这里意味着什么?

0x00000000004004b6 <main+30>:   callq  0x400398 <printf@plt>
Run Code Online (Sandbox Code Playgroud)

有谁知道?

UPDATE

为什么两个disas printf给我不同的结果?

(gdb) disas printf
Dump of assembler code for function printf@plt:
0x0000000000400398 <printf@plt+0>:  jmpq   *0x2004c2(%rip)        # 0x600860 <_GLOBAL_OFFSET_TABLE_+24>
0x000000000040039e <printf@plt+6>:  pushq  $0x0
0x00000000004003a3 <printf@plt+11>: jmpq   0x400388

(gdb) disas printf
Dump of assembler code for function printf:
0x00000037aa44d360 <printf+0>:  sub    $0xd8,%rsp
0x00000037aa44d367 <printf+7>:  mov    %rdx,0x30(%rsp)
0x00000037aa44d36c <printf+12>: movzbl %al,%edx
0x00000037aa44d36f <printf+15>: mov    %rsi,0x28(%rsp)
0x00000037aa44d374 <printf+20>: lea    0x0(,%rdx,4),%rax
0x00000037aa44d37c <printf+28>: lea    0x3f(%rip),%rdx        # 0x37aa44d3c2 <printf+98>
Run Code Online (Sandbox Code Playgroud)

assembly disassembly

71
推荐指数
2
解决办法
3万
查看次数

OS X上的弱符号别名类似于Linux上的那些,或者是最接近的等价物?

我所做的

在为Linux编写共享库时,我倾向于关注重定位,符号可见性,GOT/PLT等.

适用时,我试图避免在同一个库中的函数相互调用时调用PLT存根.例如,让我们说一个共享对象提供了两个公共函数- foo()bar()(或者那些能够通过用户调用).bar()但是,该功能也会调用foo().所以我在这种情况下做的是:

  1. 定义_foo()_bar()具有私有可见功能.
  2. 分别为和定义foo()bar()弱别名._foo()_bar()

这样,共享对象中的代码永远不会使用弱符号.它只直接调用本地函数.例如,在_bar()调用时,它会_foo()直接调用.

但是用户并不知道_*函数,并且总是使用相应的弱别名.

我是怎么做的

在Linux中,这是通过使用以下构造实现的:

extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));
Run Code Online (Sandbox Code Playgroud)

问题

不幸的是,这对OS X不起作用.我对OS X或其二进制格式没有深入的了解,所以我喋喋不休地发现了一些弱函数的例子(比如这个),但是那些并不完全与你可以有一个弱符号相同,但不是一个弱符号,它是DSO本地函数的别名.

可能解决方案

目前,我刚刚禁用了此功能(使用宏实现),因此所有符号都是全局符号并具有默认可见性.我现在想到实现同样目的的唯一方法是让所有_foo函数具有私有可见性,并具有foo默认可见性的相应函数并调用它们的"隐藏"对应物.

更好的方法?

但是,这需要更改大量代码.因此,我宁愿不去那里,除非真的没有别的办法.

那么什么是关闭OS X替代或获得相同语义/行为的最简单方法?

c linux macos linker dynamic-linking

59
推荐指数
1
解决办法
2596
查看次数

标签 统计

assembly ×1

c ×1

disassembly ×1

dynamic-linking ×1

linker ×1

linux ×1

macos ×1