当gdb bash
可执行文件(用-g编译)时,并使用info variables
检查变量。
我得到了这样的东西。符号中有点。谁能帮忙解释一下这个通知是什么意思?
Non-debugging symbols:
0x0000000100105380 read_alias_file.aliasfile
0x000000010010a320 set_pipestatus_from_exit.v
0x000000010010a458 set_maxchild.lmaxchild
0x000000010010a45c waitchld.wcontinued
0x000000010010bec4 set_restricted_shell.save_restricted
0x000000010010bed0 internal_getopt.errstr
0x000000010010bedc rangecmp.s1
0x000000010010bede rangecmp.s2
0x000000010010bee0 rangecmp_wc.s1
例如,我同时看到read_alias_file
和aliasfile
.但我不知道read_alias_file.aliasfile
是什么意思。
$ ack read_alias_file
lib/intl/localealias.c
145:static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
205: added = read_alias_file (start, locale_alias_path - start);
220:read_alias_file (fname, fname_len)
$ ack aliasfile
lib/intl/localealias.c
227: static const char aliasfile[] = "/locale.alias";
229: full_fname = (char *) alloca (fname_len + sizeof aliasfile);
232: aliasfile, sizeof aliasfile);
235: memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
我不知道read_alias_file.aliasfile是什么意思。
它是一个全局变量aliasfile
,只在函数内部可见read_alias_file
。
由于您可以在多个文件和函数中使用同名变量:
// foo.c
static int foo = 42;
// bar.c
int fn1() { static int foo = 43; ... }
int fn2() { static int foo = 44; ... }
这些变量必须在整个程序中都有存储,编译器必须以某种方式将它们全部统一,以便链接器不会将它们合并到单个变量中。
附加随机数,或文件/函数名称的哈希,或文件和函数名称是常见的策略。
使用文件/函数名称(就像您的编译器显然所做的那样)可以更轻松地分辨哪个foo
来自哪里。不过,您不应该依赖这一点 - 这完全取决于编译器(只要生成的名称在链接时足够唯一)。