Утилита stace опция -k. Откуда берутся имена функций
Порция вывода команды strace -kyf bash -c ':'
/usr/lib/libc-2.33.so(getegid+0xb) [0xcc91b]
/usr/lib/libc-2.33.so(eaccess+0x84) [0xefa74]
/usr/bin/bash(file_status+0xaf) [0x82b7f]
/usr/bin/bash(file_status+0x537) [0x83007]
/usr/bin/bash(initialize_shell_variables+0x24b) [0x461eb]
/usr/bin/bash(_start+0x8ff) [0x221ef]
/usr/bin/bash(main+0x95f) [0x209ff]
/usr/lib/libc-2.33.so(__libc_start_main+0xd5) [0x27b25]
/usr/bin/bash(_start+0x2e) [0x2191e]
Откуда берутся эти имена если вывод следующей команды пустой?
$ objdump -h $(which bash) | grep debug
Не понимаю откуда он берёт имена?
# include <stdio.h>
void show_hello ()
{
printf("Hello Word\n");
}
int main ()
{
show_hello();
}
$ gcc -Wall -g0 -fvisibility=hidden -o hello hello.c
$ strace -kf ./hello |& grep show_hello
> /tmp/hello(show_hello+0x13) [0x114c]
> /tmp/hello(show_hello+0x13) [0x114c]
> /tmp/hello(show_hello+0x13) [0x114c]
$ nm -D ./hello | grep show_hello # Нету
$ objdump -h ./hello | grep debug # Нету
Ответы (1 шт):
Имена функций могут браться из таблицы импорта и экспорта. Причем таблицы экспорта бывают не только у библиотек, но и у исполняемых файлов. Ну и часто сборка происходит с visibility=default и поэтому в таблицу экспорта попадает все подряд, а не только интерфейс (с этим беда). Эту таблицу можно вывести выполнив "nm" "-D" "/bin/bash"