我不知道你怎麼來了與你正在使用的符號名稱,但這裏是我在我的系統上看到的(Ubuntu 14.04.1):
$ objdump --dynamic-syms /lib/x86_64-linux-gnu/libc.so.6 |grep vfprintf
0000000000049cf0 g DF .text 00000000000051a8 GLIBC_2.2.5 _IO_vfprintf
00000000001097e0 g DF .text 0000000000000111 GLIBC_2.3.4 __vfprintf_chk
0000000000049cf0 g DF .text 00000000000051a8 GLIBC_2.2.5 vfprintf
這裏有一個演示程序:
#include <stdio.h>
#include <stdarg.h>
int myprintf(const char *format, ...)
{
va_list ap;
va_start(ap, format);
int result = _IO_vfprintf(stderr, format, ap);
va_end(ap);
return result;
}
int main()
{
myprintf("hello world! %s %s %s\n", "abc", "def", "ghi");
myprintf("goodbye world! %d %d\n", 123, 456);
return 0;
}
我發現,它抱怨更少,如果我先運行到main()
,然後設置斷點只b _IO_vfprintf
。
$ make CFLAGS="-Wall -Werror -g" test && ./test
$ objdump --disassemble test |grep vfprintf ## verify call isn't inlined
0000000000400480 <[email protected]>:
40061e: e8 5d fe ff ff callq 400480 <[email protected]>
$ gdb --quiet ./test
Reading symbols from ./test...done.
(gdb) b main
Breakpoint 1 at 0x400635: file test.c, line 16.
(gdb) run
Starting program: .../test
Breakpoint 1, main() at test.c:16
16 myprintf("hello world! %s %s %s\n", "abc", "def", "ghi");
(gdb) b _IO_vfprintf
Breakpoint 2 at 0x7ffff7a5ecf4
(gdb) cont
Continuing.
Breakpoint 2, 0x00007ffff7a5ecf4 in vfprintf() from /lib/x86_64-linux-gnu/libc.so.6
所以,是的,它的工作原理...
把它帶到一個新的水平 - 你可以通過應用下面的命令通過libc的源步驟...
$ sudo apt-get install libc6-dbg ## get the debug symbols
$ apt-get source libc-dev-bin ## download the source (on Ubuntu or similar)
$ gdb --quiet --directory ./eglibc-2.19/stdio-common ./test
相關注意事項here。
你說得對。如果我啓動程序,那麼我可以使用它的符號作爲斷點值進入Libc。我認爲這是因爲當我運行gdb時庫沒有被加載。只有當我運行該程序時才加載它們。謝謝。 – badnack