2017-09-21 1 views
4

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

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

+2

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

+1

Was denkst du '__func__' bedeutet? Sie müssen wissen, da es in Ihrem C-Code vorhanden ist. – Lundin

Antwort

6

Die Symbole, die Sie beobachten, weisen nicht auf die Funktion, sondern auf die Namen der Funktionen. Sie verwenden wahrscheinlich das Makro __func__ innerhalb dieser statischen Funktionen, was zur Erstellung dieser Symbole führt.

Zum Beispiel:

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

würde zur Schaffung dieser Symbole führen. Es kann durch ein Makro wie

oder ähnliches verdeckt werden, so dass es möglicherweise nicht direkt sichtbar ist.

Die statischen Funktionen selbst sind in der Symboltabelle normalerweise nicht sichtbar, da sie nicht extern verknüpft werden können.

+0

Was mich verwirrt ist, dass die .o-Datei kein Symbol der statischen Funktion enthält. Nun denke ich, dass @cmaster recht hat: Da die statische Funktion nur einmal verwendet wird, wird sie vom Compiler inline gesetzt. –

+0

@shijunzhao Das ist egal, der Name wird in solchen Symbolen gespeichert, unabhängig davon, was mit der Funktion passiert. – Ctx

+0

@shijunzhao Dies hat absolut nichts mit statischen oder Inlining zu tun, wie in dieser Antwort gezeigt. '__func__' erzeugt Textstrings in' .rodata' und das sieht man so einfach. – Lundin

Verwandte Themen