2017-09-21 3 views
4

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 
+0

@ 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. –

+2

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

+1

Que pensez-vous de "__func__"? Vous devez savoir, car il est présent dans votre code C. – Lundin

Répondre

6

Les symboles que vous observez ne dirigez pas la fonction, mais au nom des fonctions. Vous utilisez probablement la macro __func__ à l'intérieur de ces fonctions statiques, ce qui conduit à la création de ces symboles.

Par exemple:

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

conduirait à la création de ces symboles. Il peut être obscurci par une macro comme

#define FUNC_ENTRY printf("%s entered\n", __func__); 

ou similaire, il pourrait ne pas être directement visible.

Les fonctions statiques elles-mêmes ne sont généralement pas visibles dans la table de symboles car elles ne peuvent pas être liées de manière externe.

+0

Ce qui m'a troublé, c'est que le fichier .o ne contient pas le symbole de la fonction statique. Maintenant je pense que @cmaster a raison: la fonction statique n'étant utilisée qu'une seule fois, elle est inline par le compilateur. –

+0

@shijunzhao Cela n'a pas d'importance, le nom est stocké dans de tels symboles, quoi qu'il arrive avec la fonction. – Ctx

+0

@shijunzhao Cela n'a absolument rien à voir avec le statique ou l'inline, comme le montre cette réponse. '__func__' génère des chaînes de texte dans' .rodata' et c'est ce que vous voyez, aussi simple que cela. – Lundin