简体   繁体   中英

Why is "gdb" listing multiple functions after executing the "start' command even when the C++ source file doesn't contain any function?

The context

Consider the following file

$ cat main.cpp
int main() {return 0;}

I can list all the available functions by executing

$ g++ -g main.cpp && gdb -q -batch -ex 'info functions -n' a.out
All defined functions:

File main.cpp:
1:      int main();

When executing start before executing info functions more than 1000 functions are listed (see below)

g++ -g main.cpp && \
  gdb -q -batch -ex 'start' -ex 'info functions -n' a.out | \
  head -n 10
Temporary breakpoint 1 at 0x111d: file main.cpp, line 1.

Temporary breakpoint 1, main () at main.cpp:1
1   int main() {return 0;}
All defined functions:

File /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/allocated_ptr.h:
70: void std::__allocated_ptr<std::allocator<std::_Sp_counted_ptr_inplace<std::filesystem::__cxx11::filesystem_error::_Impl, std::allocator<std::filesystem::__cxx11::filesystem_error::_Impl>, (__gnu_cxx::_Lock_policy)2> > >::~__allocated_ptr();
70: void std::__allocated_ptr<std::allocator<std::_Sp_counted_ptr_inplace<std::filesystem::filesystem_error::_Impl, std::allocator<std::filesystem::filesystem_error::_Impl>, (__gnu_cxx::_Lock_policy)2> > >::~__allocated_ptr();

As seen below, the total number of lines printed is so, apparently, more than 1000 functions are being listed

g++ -g main.cpp && gdb -q -batch -ex 'start' -ex 'info functions -n' a.out | wc -l
4436

The question

As we can see above, the main.cpp file does not contain any function, so why is gdb listing those functions when the start command has been executed before but not when start hasn't been executed?

Additional context

As suggested in one of the comments of this question, here's the output of executing info shared after start has been executed

g++ -g main.cpp && gdb -q -batch -ex 'start' -ex 'info shared' a.out
Temporary breakpoint 1 at 0x111d: file main.cpp, line 1.

Temporary breakpoint 1, main () at main.cpp:1
1   int main() {return 0;}
From                To                  Syms Read   Shared Object Library
0x00007ffff7fd2090  0x00007ffff7ff2746  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7e4c040  0x00007ffff7f37b52  Yes         /usr/lib/libstdc++.so.6
0x00007ffff7c7f3b0  0x00007ffff7d1a658  Yes (*)     /usr/lib/libm.so.6
0x00007ffff7c59020  0x00007ffff7c69ca5  Yes         /usr/lib/libgcc_s.so.1
0x00007ffff7ab3650  0x00007ffff7bfe6bd  Yes (*)     /usr/lib/libc.so.6
(*): Shared library is missing debugging information.

main.cpp file does not contain any function, so why is gdb listing those functions when the start command has been executed before but not when start hasn't been executed?

Before start , GDB reads symbols (and debug info) only for the main executable.

After start , a dynamically linked executable loads shared libraries (seen in info shared ), and GDB (by default) reads symbol tables and debug info for each of them. And since these libraries contain hundreds of functions, GDB knows about all of them.

You can prevent this with set auto-solib-add off , but usually you don't want to do that. If you do, and your program crashes in eg abort , GDB will not know where you crashed unless you manually add the symbols back using sharedlibrary or add-symbol-file command .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM