003
22.05.2012, 15:09 Uhr
ao
(Operator)
|
Zitat von FloSoft: |
Code: |
.globl _Z3foov .type _Z3foov, @function _Z3foov: ;hier ist unser foo
; ............
.globl main .type main, @function main: ;und hier die main
|
|
Das ist ja das Interessante: foo () wird gemangelt zu _Z3foov, main () wird nicht gemangelt, sondern bleibt 1:1 stehen und kriegt noch nicht mal den sonst üblichen Unterstrich.
Zitat von Hans: |
Soweit ich weis, ist es in C und C++ definiert, also im Srandard festgelegt, dass ein Programm mit der Funktion main() anzufangen hat, weshalb diese deshalb vom Startupcode aufgerufen wird. Darum muss es in einem lauffähigen Programm eine main-funktion geben, während sie in Modulen durchaus fehlen darf. Hat also nichts mit Magie zu tun.
|
Dass der Name main im Standard festgelegt ist, weiß ich. Aber solche Festlegungen dienen ja nur dazu, dass man portablen Code schreiben kann, der von jedem C++-Compiler übersetzt wird. Dass main auf "magische" Weise anders kompiliert wird als andere Funktionsnamen, war mir neu.
Doch, es muss magisch sein. Ich hab hier einen Schnipsel aus dem Startupcode für meinen Microcontroller (ARM Cortex M3, gcc-Assembler):
Code: |
// hier kann man den Namen der Hauptfunktion "überschreiben" #ifndef APP_ENTRY_POINT #define APP_ENTRY_POINT main #endif
// Jetzt kommt ganz viel Startup-Kram: // Stack klarmachen, Variablen initialisieren, // BSS nullen, Heap einrichten, Konstruktoren aufrufen, // und dann das hier:
ldr r2, =APP_ENTRY_POINT // Adresse von main laden blx r2 // und anspringen.
|
Modifiziere ich das so:
Code: |
#ifndef APP_ENTRY_POINT #define APP_ENTRY_POINT haupt // Haupt-Funktion heißt jetzt "haupt" #endif
|
dann funktioniert das nur, wenn ich im Cpp-Code schreibe:
C++: |
extern "C" int haupt () // hier muss extern "C" hin, sonst Linkerfehler. { return 0; }
|
Dieser Post wurde am 22.05.2012 um 15:11 Uhr von ao editiert. |