在gcc使用-g3编译的时候, gdb可以查看对应c语言的宏.
gdb a.out -ex 'list main' -ex 'info macro XXXX' -ex 'q'
Defined at /xvdc/w.c:6 #define XXXX ppppppppppppp
但是o文件却看不了对应的宏,
gdb w.o -ex 'list main' -ex 'info macro XXXX' -ex 'q'
The symbol `XXXX' has no definition as a C/C++ preprocessor
<user-defined>:-1
网上找了半天也没发现什么有用的地方, 只能自己看gdb的源代码调
一路调试了半天, 找到了个关键地方
函数dwarf_decode_macros里面解析macinfo_type的时候, a.out和w.o有所区别
switch (macinfo_type)
{
/* A zero macinfo type indicates the end of the macro
information. */
case 0:
break;
case DW_MACRO_define:
case DW_MACRO_undef:
case DW_MACRO_start_file:
case DW_MACRO_end_file:
a.out文件的macinfo_type序列是DW_MACRO_import DW_MACRO_start_file
o文件的macinfo_type序列是5个DW_MACRO_define_strp
而在gdb内部产生macro表格的路径是由DW_MACRO_start_file开始的
case DW_MACRO_start_file:
{
unsigned int bytes_read;
int line, file;
line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
mac_ptr += bytes_read;
file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
mac_ptr += bytes_read;
current_file = macro_start_file (file, line, current_file, lh);
}
下一步要做的就是看看如何让gcc在生产o文件的时候, section .debug_macro里面带上DW_MACRO_start_file
看遍gcc选项也没发现什么, 难道又要去看gcc源代码了, 这种突如其来的领域问题真是难搞