#gdb
#gdb
Вопрос:
Я пытаюсь вызвать функцию с
(gdb) call fun()
в сторонней библиотеке libFoo
, которую я получаю в скомпилированном виде с разделенными символами.
(gdb) info function ^fun$
Non-debugging symbols:
0x00007ffff6d7e3b0 fun
Проблема в том, что загружена несвязанная системная библиотека libBar
, в которой на этот раз также есть fun
переменная, и gdb предпочитает этот символ вместо желаемого. Я подозреваю, что это связано с тем, что это попадание является не разделенным символом отладки.
(gdb) info var ^fun$
File ../bar/baz.c:
256: static const int fun[18];
(gdb) info symbol fun
fun in section .rodata of libBar.so
Немного странно, что он пытается вызвать переменную как функцию, но это то, что он пытается сделать.
Вопрос в том, как мне устранить неоднозначность символа и указать gdb использовать его из libFoo
?
Пока что единственный способ, который я нашел, требует ручного шага ( info function ^fun$
выше), а затем call (void)0x00007ffff6d7e3b0()
. Это не слишком хорошо, потому что это не позволяет мне писать сценарий вызова для разных запусков программы.
Комментарии:
1. Может быть лучшее решение, но вы могли бы попробовать это:
call ((void(*)())0x00007ffff6d7e3b0)()
2.
call ((void(*)())0x00007ffff6d7e3b0)()
не лучше, чем(void)0x00007ffff6d7e3b0()
. Оба работают, но в обоих случаях адрес специфичен для запуска программы и не может использоваться в скрипте, предназначенном для работы при любом запуске. Но вы, наверное, хотели сказатьcall ((void(*)())fun)()
? К сожалению, это также пытается вызвать неправильный символ.