„Datei nicht erkannt“, während der GNU-Linker mit
-
23-08-2019 - |
Frage
Ich mache wahrscheinlich etwas falsch, ein Neuling zu sein. Könnten Sie mir bitte helfen?
Ich habe ein einfaches Hallo Welt Programm in C geschrieben namens hello.c und lief den folgenden Befehl ein:
gcc -S hello.c
, die hello.s
erzeugt. Dann habe ich die Datei mit GNU Assembler, as
:
as hello.s
, die eine nicht-ausführbare a.out
erzeugt, der muss noch verknüpft werden, verstehe ich?
Ich versuche, es zu verknüpfen, indem ld
verwenden, etwa so:
ld a.out
Aber erhalten folgende Fehlermeldung:
a.out: file not recognized: File truncated
Und ld
löscht meine Datei.
Dies ist ein x86 Ubuntu-System. Was mache ich falsch? Vielen Dank!
Lösung
Meine erste Frage wäre: Warum sind Sie den Code zusammenbauen? Wenn Sie den Assembler-Code die, mit allen Mitteln wollen, verwenden Sie gcc -S
es zu erhalten (zum Betrachten, glaube ich).
Aber Sie brauchen nicht, dass durch as
laufen in Gang zu halten, benutzen Sie einfach:
gcc -o hello hello.c
gcc -S hello.c
Das erste Schritt wird die C-Quelle schalten direkt in eine ausführbare Datei, die zweite wird geben Sie Ihren Assembler-Quelle.
Ihr spezifisches Problem kann sein, dass ld
versucht, seine Ausgabe an a.out
zu schreiben. Wenn das auch Ihre Eingabedatei, kann es gut in dem Prozess werden wird ld
laufen zerstört. Sie könnten versuchen, a.out
vor dem Ausführen des ld Befehl a.in
Umbenennung. ld a.in
Andere Tipps
Hier ist, wie ich es tun:
> gcc -S forums.c
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums
test
Warum rufe ich gcc
statt ld
? Da GCC nimmt die C-Laufzeit zu verknüpfen, und tun andere Implementierung abhängig Sachen. Wenn Sie das sehen wollen, verwenden Sie die Option --verbose
:
> gcc --verbose forums.o -o forums
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread model: posix
gcc version 4.4.0 (GCC)
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic'
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o
EDIT: Okay, habe ich versucht, das alles auf meinem System, und ich glaube, ich weiß, was das Problem ist. ld
schreibt (die Standardausgabedatei) a.out
, während von ihm zur gleichen Zeit mit dem Lesen. Probieren Sie etwas wie folgt aus:
ld a.out -o myprog
neu installieren glibc-devel sowieso Sie können und überprüfen, ob es funktioniert. dieser Prozess für mich arbeiten.