2016-02-23 5 views
1

см простой код ниже:Как я могу получить правильный адрес функции на 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 not xlC.
  2. Как получить реальный адрес функции в C на AIX?

Заранее благодарен!

+0

Вы посмотрели, что находится на '0x100003d8'? Я не эксперт в * AIX * и связанной с ним платформе, но, возможно, там есть функция заглушки? Можете ли вы опубликовать разборку на '0x100003d8'? –

+0

@MargaretBloom, я частично добавляю дизассемблирование 0x100003d8, я думаю, что это точка входа. Спасибо. – Pin

+0

У меня очень плохое чувство о * почему * вам (кажется, вам) нужен «реальный адрес». Для всех практических целей 'foo' * является *« реальным адресом ». Если вы не хотите писать дизассемблер или что-то подобное, вы не должны беспокоиться о «реальном» значении ... – DevSolar

ответ

1

Почему различное определение адреса функции в AIX?

nm -Pg ./f_addr | grep foo 

Попробуйте эту команду, и вы увидите, что у вас слишком символы: foo и .foo Один из них живет в сегменте коды (или текстовом сегменте), с другой стороны, в сегменте данных.

Цель, действительно, создание косвенности в вызове функции; это важно при создании/использовании разделяемых библиотек.

Это связано с gcc? Я должен использовать gcc не xlC.

No.

Как получить реальный адрес функции в C на AIX?

Просьба уточнить ваш вопрос: что вы хотите делать с «настоящим адресом».

+0

спасибо. Думаю, я могу получить точку входа в направлении. Я переношу инструменты Linux в Aix, для этого кода необходимо, чтобы точка входа вызывала его функцию во время выполнения. Я использую 'void ** p = foo; void * p1 = * p; 'это правильно? – Pin

+0

Вам не нужно ничего делать, 'void * funptr = (void *) foo' будет работать так же, как работает в linux. –