см простой код ниже:Как я могу получить правильный адрес функции на 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 для компиляции. У меня есть вопросы и ответы:
- почему различные определения адреса функции на AIX? это связано с gcc? Мне нужно использовать gcc not xlC.
- Как получить реальный адрес функции в C на AIX?
Заранее благодарен!
Вы посмотрели, что находится на '0x100003d8'? Я не эксперт в * AIX * и связанной с ним платформе, но, возможно, там есть функция заглушки? Можете ли вы опубликовать разборку на '0x100003d8'? –
@MargaretBloom, я частично добавляю дизассемблирование 0x100003d8, я думаю, что это точка входа. Спасибо. – Pin
У меня очень плохое чувство о * почему * вам (кажется, вам) нужен «реальный адрес». Для всех практических целей 'foo' * является *« реальным адресом ». Если вы не хотите писать дизассемблер или что-то подобное, вы не должны беспокоиться о «реальном» значении ... – DevSolar