GNU 링커를 사용하는 동안 "파일 인식되지 않음"
-
23-08-2019 - |
문제
나는 아마도 뭔가 잘못하고 있고, 초보자 일 것입니다. 제발 도와 주시겠습니까?
나는 C에서 Hello.c라는 간단한 Hello World 프로그램을 작성했으며 다음 명령을 실행했습니다.
gcc -S hello.c
그것은 생산 된 것입니다 hello.s
. 그런 다음 그 파일을 GNU 어셈블러와 함께 사용했습니다. as
:
as hello.s
이는 실행 불가능한 것을 생산했습니다 a.out
, 어느 것이 여전히 연결되어야하는지 이해합니까?
사용하여 연결하려고합니다 ld
, 그렇게 :
ld a.out
그러나 다음 오류를 받으십시오.
a.out: file not recognized: File truncated
그리고 ld
내 파일을 삭제합니다.
이것은 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을 다시 설치하고 그것이 작동하는지 확인하십시오. 이 과정은 저에게 효과적입니다.