为什么C静态函数不会转到文本部分而是转到rodata部分?

时间:2017-09-21 07:49:27

标签: c gcc compilation

我在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 

1 个答案:

答案 0 :(得分:6)

您观察到的符号不是指向函数,而是指向函数的名称。您可能在这些静态函数中使用宏__func__,这会导致创建这些符号。

例如:

printf("%s: %s\n", __func__, somemsg);

将导致创建这些符号。它可能会被像

这样的宏所掩盖
#define FUNC_ENTRY printf("%s entered\n", __func__);

或类似,因此可能无法直接显示。

静态函数本身通常在符号表中不可见,因为它们无法在外部链接。