2015-05-29 5 views
0

Я работаю над Ubuntu 14.04 LTS.nm против gdb break

У меня есть исполняемый файл exec, составленный от file.c. file.c использует функции из статической библиотеки. Например, предположим, что fubar() является функцией статической библиотеки, которая используется в file.c. Это то, что я заметил.

  • nm exec | grep fubar дает определенное значение.
    (в моей системе и для моего исполняемого файла, 0808377f)
  • gdb ./exec, а затем break fubar дает другое значение.
    (в моей системе и для моего исполняемого файла, 0x8083785)

Когда я сделать подобную вещь для другого исполняемого файла (exec1, составленный из file1.c, он выдает то же значение для обеих команд).

Обе команды должны выдавать один и тот же виртуальный адрес. Не так ли? Я, очевидно, что-то пропустил. Может кто-нибудь объяснить, что именно происходит? И в чем разница между обеими командами.

ответ

2

Запрет таких необычных вещей, как -fPIE, то, что происходит здесь, заключается в том, что команда gdb break function на самом деле означает «перерыв после пролога функции для function». Таким образом, аргументы настраиваются должным образом к моменту достижения точки останова.

Если вы хотите разорвать именно на первой инструкции функции, используйте синтаксис *, как:

(gdb) break *function 

Если вы сделаете это адреса, вероятно, совпадают.