Утилита 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 шт):

Автор решения: user7860670

Имена функций могут браться из таблицы импорта и экспорта. Причем таблицы экспорта бывают не только у библиотек, но и у исполняемых файлов. Ну и часто сборка происходит с visibility=default и поэтому в таблицу экспорта попадает все подряд, а не только интерфейс (с этим беда). Эту таблицу можно вывести выполнив "nm" "-D" "/bin/bash"

→ Ссылка