我在C源文件中定义了一些静态函数。编译之后,我使用nm工具显示.o文件中的所有符号,并发现我所定义的所有静态函数都在rodata部分,其符号名称为 func .xxxx。该函数不应该位于文本函数中吗?
以下是显示静态函数的nm命令的结果。 ' r'在 func 之前.xxxx意味着该函数存储在rodata部分。
00000000 t desc_to_mattr
U __do_panic
00000000 r __func__.5546
00000000 r __func__.5554
00000000 r __func__.5560
00000000 r __func__.5565
00000000 r __func__.5604
00000000 r __func__.5638
00000000 r __func__.5698
00000000 r __func__.5710
00000000 r __func__.5719
00000000 r __func__.5729
00000000 r __func__.5758
以下是我的gcc选项:
arm-linux-gnueabihf-gcc -std=gnu99 -Werror -fdiagnostics-show-option -Wall -Wcast-align -Werror-implicit-function-declaration -Wextra -Wfloat-equal -Wformat-nonliteral -Wformat-security -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wshadow -Wstrict-prototypes -Wswitch-default -Wwrite-strings -Wno-missing-field-initializers -Wno-format-zero-length -Waggregate-return -Wredundant-decls -Wold-style-definition -Wstrict-aliasing=2 -Wundef -pedantic -Wdeclaration-after-statement -Os -g -ffunction-sections -fdata-sections -pipe -g3 -mcpu=cortex-a9 -mfloat-abi=soft -funwind-tables -mthumb -mthumb-interwork -fno-short-enums -fno-common -mno-unaligned-access -MD -MF
答案 0 :(得分:6)
您观察到的符号不是指向函数,而是指向函数的名称。您可能在这些静态函数中使用宏__func__
,这会导致创建这些符号。
例如:
printf("%s: %s\n", __func__, somemsg);
将导致创建这些符号。它可能会被像
这样的宏所掩盖#define FUNC_ENTRY printf("%s entered\n", __func__);
或类似,因此可能无法直接显示。
静态函数本身通常在符号表中不可见,因为它们无法在外部链接。