如何在Aix上获得正确的功能地址?

时间:2016-02-23 07:49:22

标签: gcc aix

请参阅下面的简单代码:

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中获取实际的函数地址?
  3. 提前致谢!

1 个答案:

答案 0 :(得分:1)

  

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

nm -Pg ./f_addr  | grep foo

尝试使用此命令,您会看到符号太多:foo.foo其中一个位于代码段(或文本段)中,另一个位于数据段中。< / p>

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

  

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

没有

  

如何在AIX上用C获取实际函数地址?

请澄清您的问题:您想对“真实地址”做些什么。