“файл не распознан” при использовании компоновщика GNU
-
23-08-2019 - |
Вопрос
Наверное, я делаю что-то не так, будучи новичком.Не могли бы вы, пожалуйста, помочь мне?
Я написал простую программу Hello World на C под названием hello.c и выполнил следующую команду:
gcc -S hello.c
Это произвело hello.s
.Затем я использовал этот файл с GNU assembler, as
:
as hello.s
Который породил неисполняемый a.out
, который все еще нужно связать, я так понимаю?
Я пытаюсь связать это с помощью ld
, вот так:
ld a.out
Но получаем следующую ошибку:
a.out: file not recognized: File truncated
И ld
удаляет мой файл.
Это система Ubuntu x86.Что я делаю не так?Большое спасибо!
Решение
Мой первый вопрос был бы таким:зачем вы собираете код?Если вам нужен код на ассемблере, то, во что бы то ни стало, используйте gcc -S
чтобы получить его (для просмотра, я думаю).
Но вам не нужно повторять это до конца as
чтобы продолжать работать, просто используйте:
gcc -o hello hello.c
gcc -S hello.c
Этот первый шаг превратит исходный код C непосредственно в исполняемый файл, второй предоставит вам ваш исходный код на ассемблере.
Ваша конкретная проблема может заключаться в том, что ld
пытается записать свои выходные данные в a.out
.Если это также ваш входной файл, он вполне может быть уничтожен в процессе запуска ld
.Вы могли бы попробовать переименовать a.out
Для a.in
перед запуском команды ld: ld a.in
.
Другие советы
Вот как я это делаю:
> gcc -S forums.c
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums
test
Почему я призываю gcc
вместо того , чтобы ld
?Потому что GCC заботится о связывании среды выполнения C и выполнении других вещей, зависящих от реализации.Если вы хотите увидеть это, используйте --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
Редактировать:хорошо, я опробовал все это в своей системе, и мне кажется, я знаю, в чем проблема. ld
пишет в a.out
(его выходной файл по умолчанию), одновременно считывая из него данные.Попробуйте что-то вроде этого:
ld a.out -o myprog
переустановите glibc-devel в любом случае, как только сможете, и проверьте, работает ли это.этот процесс работает для меня.