• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

gcc undefined symbols

nightmarevs

Alkmene
Registriert
09.07.09
Beiträge
33
Abend,

nachdem ich mir jetzt auf dem mac soweit alles an Entwicklungs- und Testumgebung eingerichtet habe wollte ich ein erstes Projekt compilieren, gcc war damit anscheinend nicht ganz so einverstanden. Es ist nur ein einfaches Testprojekt bestehend aus einer einer C Datei

test.c:
Code:
#include <stdio.h> 
extern int method(int n);
 
int main(void)
{    
    printf(method(2));
    return 0;
}

code.S:
Code:
[COLOR=#991664].section.text[COLOR=#000000],[/COLOR][/COLOR]

[COLOR=#991664].globl[/COLOR] method
[COLOR=#991664]method:
...[/COLOR]

Das man global durch globl ersetzen muss hab ich bereits rausgefunden, allerdings will mir gcc das ganze so nicht linken

gcc -m32 -o prog code.S test.c

gibt mir den Fehler

Undefined symbols for architecture i386:
"_method", referenced from:
_main in ccfrOLS9.o
ld: symbol(s) not found for architecture i386


Am Code liegt es definitiv nicht da das ganze auf einer Linux Maschine das gewünschte Ergebnis gebracht hat. Hat mir jemand einen Tipp wo das Problem liegt? Die Forensuche und google haben hier leider nicht viel weitergeholfen weil bei den ganzen Problemen jeweils eine Bibliothek oder ähnliches gefehlt hat was hier ja nicht der Fall ist, sonst würde der Code auf einer anderen Architektur nicht problemlos laufen.
 
Da ist noch etwas nicht richtig, ich kann Dir aber jetzt auf die Schnelle nicht sagen, was: Deine Funktion landet eben nicht in der (__TEXT,__text) Section. Damit ist auch erklärt, warum der Linker sie nicht finden kann.

Assembler ist jetzt bei mir schon lange her, da müsste ich jetzt noch mal tiefer buddeln. Hilfreiche Werkzeuge hier sind aber nm und otool -t -v

Gruss

Alex
 
Also, richtig sollte sein:
Code:
[COLOR=#991664].text[/COLOR]

[COLOR=#991664].globl[/COLOR] _method
[COLOR=#991664]_method:
...[/COLOR]

Alex
 
Vielen dank schonmal, so gehts jetzt auch auf dem Mac. Momemtan hab ich nur noch 2 Probleme: 1. ".extern xyz" mag er nicht und 2. ".int xyz" auch nicht. Wieder lief beides auf einer anderen Maschine schon. Weiß jemand zufällig welche Befehle der OSX linker da sehen möchte?
 
Wichtig: Wenn Du ein neueres OS X benutzt, dann ist gcc hier gar kein gcc, sondern llvm mit gcc Frontend (mach mal: ls -l `which gcc`) . Der soll natürlich angeblich 100% kompatibel sein zu gcc, ob das aber auch für Assembly gilt, kann ich Dir nicht sagen.

Ich denke mal es lohnt sich für Dich, Dir da mal die llvm Dokumentation anzusehen.

HTH

Alex
 
danke das wusste ich nicht, ich dachte wenn das ding gcc heist wirds auch das passende sein aber anscheinend nicht, zumindest hier ist er nicht 100% kompatibel. Dann werde ich wohl mal die Dokumentation lesen müssen, sehr seltsam
 
Apple hat sich von gcc verabschiedet, der neue König heisst llvm. Das gcc Frontend ist nur als "Übergangshilfe" gedacht.

Alex
 
na toll, dann schau ich besser mal wo ich einen richtigen gcc herbekomme
 
Älteres OS X, oder Macports. Besser und zukunftssicherer: Code auf llvm, as oder nasm anpassen.

Gruss

Alex
 
Bei Xcode 3.2.6 ist der gcc dabei.
 
ich würde den Code gerne auf llvm anpassen nur fehlt mir momentan die Zeit die ganzen eigenheiten einzeln rauszusuchen. Gibt es vllt. eine Liste mit unterschieden zu gcc? Google wollte mir leider nicht helfen den passenden ersatz für .extern und .int zu finden