【问题标题】:How can I get correct function address on Aix?如何在 Aix 上获得正确的函数地址?
【发布时间】:2016-06-04 22:38:35
【问题描述】:

请看下面的简单代码:

int foo(int a)
{
   return a;
}
int main() {
   printf("%x\n", foo);
   printf("%x\n", &foo);
   printf("%x\n", *foo);  
   foo(1);  
}

它们都显示相同的值:

0x20453840 
0x20453840 
0x20453840

我使用 gdb 来检查 foo() 入口点是:

(gdb) p foo
$1 = {int (int)} 0x100003d8 <foo>

0x20453840的值其实是指针的foo()指针:

(gdb) p /x *0x20453850
$3 = 0x100003d8
(gdb) si              
   0x10000468      76         foo(1);
   0x10000464 <main+76>:        38 60 00 01     li      r3,1
=> 0x10000468 <main+80>:        4b ff ff 71     bl      0x100003d8 <foo>
(gdb) 
foo (a=541407312) at insertcode.c:57
57      {
=> 0x100003d8 <foo+0>:  93 e1 ff fc     stw     r31,-4(r1)
   0x100003dc <foo+4>:  94 21 ff e0     stwu    r1,-32(r1)
   0x100003e0 <foo+8>:  7c 3f 0b 78     mr      r31,r1
   0x100003e4 <foo+12>: 90 7f 00 38     stw     r3,56(r31)
(gdb) 

所以我认为 0x100003d8 是入口点。 我使用 gcc 4.6.2 编译。 我有两个问题:

  1. 为什么 AIX 上的函数地址定义不同?它与gcc有关吗? 我必须使用 gcc 而不是 xlC。
  2. 如何在 AIX 上获取 C 中的真实函数地址?

提前致谢!

【问题讨论】:

  • 你看过0x100003d8的内容了吗?我不是AIX 和相关平台的专家,但也许那里有存根函数?你能把反汇编发到0x100003d8吗?
  • @MargaretBloom,我已经部分添加了 0x100003d8 反汇编,我认为这是入口点。谢谢。
  • 我对为什么你(认为你)需要“真实地址”有一种非常不好的感觉。出于所有实际目的,foo “真实地址”。除非您想编写反汇编程序或类似的东西,否则您不应该为“真实”值而烦恼...

标签: gcc aix


【解决方案1】:

为什么 AIX 上的函数地址定义不同?

nm -Pg ./f_addr  | grep foo

试试这个命令,你会发现有太多符号:foo.foo 其中一个位于代码段(或文本段)中,另一个位于数据段中。

目的确实是在函数调用中创建间接;这在创建/使用共享库时很重要。

它与gcc有关吗?我必须使用 gcc 而不是 xlC。

没有。

如何在 AIX 上获取 C 中的真实函数地址?

请澄清您的问题:您想如何处理“真实地址”。

【讨论】:

  • 谢谢。我想我可以得到方向入口点。我正在将一个 Linux 工具移植到 Aix 中,代码需要入口点才能在运行时调用其函数。我用的是void ** p = foo; void * p1 = *p;,对吗?
  • 您不必做任何特别的事情,void *funptr= (void *)foo 将像在 linux 中一样工作。
猜你喜欢
  • 1970-01-01
  • 2019-05-18
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多