C-Funktion von assembler aus aufrufen.



  • Hi,

    ich versucher gerade eine C-Funktion von assembler aufzurufen.
    ich arbeite von linux - gcc aus und
    von Windows MINGW auf diesem Projekt

    Leider funktioniert das Folgende nur unter linux:

    start.S:

    // Init ist eine Funktion aus init.c
    .extern init
    ..
    _start: 
        // Stack initialisieren
        mov $kernel_stack, %esp
    
        // C-Code aufrufen
        call init
    

    init.c:

    #ifdef __cplusplus
    extern "C"
    {
    
    #endif
    
    void init(void)
    {
    .....
    

    kernel.ld:

    /*
         * Der Multiboot-Header muss zuerst kommen (in den ersten 8 kB).
         * Die Standardsektionen einfach hintereinander weg einbinden.
         */
        .text : {
            *(multiboot)
            *(.text)
    		*(.gnu.linkonce.t*)
        }
    

    Makefile:

    ASFLAGS = -m32
    CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc 
    
    ifeq ($(OS),Windows_NT)
        #Windows stuff
        LDFLAGS = -mi386pe -Tkernel.ld
    else
        #Linux stuff
    	LDFLAGS = -melf_i386 -Tkernel.ld
    endif
    

    Ich bekomme beim linken mit ld:

    start.o:fake:(.text+0x12): undefined reference to 'init'

    Erstaunlicher Weise aber nicht immer.
    Sonder an einem Tag gehts, an nem anderen nicht.
    ich mache immer ein make clean, bevorich ein make mache....

    Würde mich über HIlfe sehr freuen.
    Habe versucht es kurz zu halen, damit man nicht zu viel lesen muss
    Gruss Alex



  • MINGW braucht _init und gcc nicht ??
    Ja das ist es.

    Gibt es eine möglichkeit das zuumgehen ??
    Also mit einem

    #ifdef MINGW
    ...
    

    oder so ??



  • AlexanderKiebler schrieb:

    #ifdef MINGW
    ...
    

    oder so ??

    Zumindest gibt es __MINGW32__



  • Kann schon sein das MingW ne andere Konvention folgt wegen den Unterstrichen. Das gewünschte Verhalten lässt sich aber auch mit Parameter erzwingen: -fleading-underscore bzw. -fno-leading-underscore.



  • Hi, Tobi der zweite 🙂
    Hi, MinGw

    danke für die Schnellen Antworten.
    Klasse das man das Verhalten über einen compilerschalter definieren kann:
    -fleading-underscore bzw. -fno-leading-underscore.

    Gruß und Dank,
    Alex


Anmelden zum Antworten