【发布时间】: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 编译。 我有两个问题:
- 为什么 AIX 上的函数地址定义不同?它与gcc有关吗? 我必须使用 gcc 而不是 xlC。
- 如何在 AIX 上获取 C 中的真实函数地址?
提前致谢!
【问题讨论】:
-
你看过
0x100003d8的内容了吗?我不是AIX 和相关平台的专家,但也许那里有存根函数?你能把反汇编发到0x100003d8吗? -
@MargaretBloom,我已经部分添加了 0x100003d8 反汇编,我认为这是入口点。谢谢。
-
我对为什么你(认为你)需要“真实地址”有一种非常不好的感觉。出于所有实际目的,
foo是“真实地址”。除非您想编写反汇编程序或类似的东西,否则您不应该为“真实”值而烦恼...