Je définis certaines fonctions statiques dans un fichier source C. Après l'avoir compilé, j'utilise nm tool pour afficher tous les symboles dans le fichier .o, et trouve que toutes mes fonctions statiques définies sont dans la section rodata, et leurs noms de symboles sont func .xxxx. La fonction ne devrait-elle pas être située dans la fonction de texte?Pourquoi les fonctions statiques de C ne vont pas à la section de texte mais à la section de rodata?
Voici les résultats de la commande nm affichant les fonctions statiques. Le 'r' avant func .xxxx signifie que la fonction est stockée dans la section 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
Suite est mon option 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
@ M.M Les fonctions 'static' sont-elles visibles par l'éditeur de liens? Il se peut bien qu'ils soient traités par le compilateur et que l'éditeur de liens ne les voit jamais. –
Si vous définissez simplement la fonction mais que vous ne l'utilisez pas, elle ne va pas nécessairement n'importe où: elle peut être lâchée sur place par le compilateur. Si vous l'utilisez exactement une fois, il y a de fortes chances que le compilateur l'insère * quelle que soit sa longueur *, et aucune version autonome ne sera compilée comme ci-dessus. Le fait est que lorsque vous dites 'static', le compilateur connaît déjà toutes les utilisations de la fonction et peut optimiser en conséquence. – cmaster
Que pensez-vous de "__func__"? Vous devez savoir, car il est présent dans votre code C. – Lundin