Ich definiere einige statische Funktionen in einer C-Quelldatei. Nach dem Kompilieren verwende ich das nm-Tool, um alle Symbole in der .o-Datei anzuzeigen, und stelle fest, dass sich alle meine definierten statischen Funktionen im Rodata-Abschnitt befinden und der Name ihrer Symbole func .xxxx lautet. Sollte sich die Funktion nicht in der Textfunktion befinden?Warum C statische Funktionen nicht zum Textbereich, sondern zum Rodata-Bereich?
Im Folgenden finden Sie die Ergebnisse des Befehls nm, der die statischen Funktionen anzeigt. Das 'r' vor func .xxxx bedeutet, dass die Funktion im Rodata-Abschnitt gespeichert ist.
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
Es folgt mein gcc-Option:
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 Sind "statische" Funktionen für den Linker sichtbar? Es kann gut sein, dass sie vom Compiler behandelt werden und dass der Linker sie niemals sieht. –
Wenn Sie nur die Funktion definieren, sie aber nicht verwenden, geht sie nicht unbedingt irgendwohin: Sie kann vom Compiler vor Ort gelöscht werden. Wenn Sie es genau einmal verwenden, ist es wahrscheinlich, dass es vom Compiler inline geschrieben wird * egal wie lange es ist *, und keine freistehende Version wird wie oben kompiliert. Der Punkt ist, wenn Sie 'static' sagen, der Compiler weiß bereits über * alle * Verwendungen der Funktion und kann entsprechend optimieren. – cmaster
Was denkst du '__func__' bedeutet? Sie müssen wissen, da es in Ihrem C-Code vorhanden ist. – Lundin