MinGW 에서 linker error
글쓴이: ichoong / 작성시간: 일, 2008/06/29 - 1:06오전
Windows XP에 MinGW를 설치해서
프로그램을 좀 짜보려고 하는데요.
제가 리눅스나 gnu tool에 익숙하지 않아서 그러는데요.
아주 기본적인 프로그램을 짜고 gnu linker로 link를 시도하면 error가 나네요.
예를들어
#include
int main()
{
printf("hello\n");
}
라는 test.c 파일을
> gcc -c test.c
로 컴파일 하고
> ld -o test test.o
를 하면
test.o:test.c:(.text+0x21): undefined reference to `_alloca
test.o:test.c:(.text+0x26): undefined reference to `__main'
test.o:test.c:(.text+0x32): undefined reference to `printf'
이런 에러가 나면서 링크가 안되네요.
> ld -o test -Ttext 0x0 -e main test.o
인터넷에서 위와같이 실행하는 예제가 있어서
이렇게 해도 마찬가지로 에러가 납니다.
그냥 gcc로 -o option주고 link까지 하면 잘 컴파일되고 실행됩니다.
혹시나해서 cygwin을 설치해서 해봐도 같은 에러가 발생하는군요.
제가 뭘 잘못알고 있나요?
Forums:
표준 라이브러리와 startup stub (crt*.o)를 같이 링크해 줘야 합니다.
ld로 링크 시킨다면 두 작업을 다 해줘야 합니다. 따라서 gcc를 통해서 링크시키는 방법이 최적입니다. 특별한 이유가 있어서 startup stub을 무시해야 한다거나 할 경우에만 ld를 통해 직접 링크하시기 바랍니다.
gcc 에 -v 옵션을
gcc 에 -v 옵션을 붙이면 컴파일과 링크과정을 볼 수 있습니다.
궁금하다면, 링커가 어떤 옵션으로 실행되는 지 살펴보세요.
OTL
ld -m elf_i386 -Ttext 0x0 -e
ld -m elf_i386 -Ttext 0x0 -e main -o test [원도우즈 패스]/crt1.o [원도우즈 패스]/crti.o [원도우즈 패스]/crtn.o test.o -lc
-Ttext 0x0 -e main 옵션을 왜 넣으신지 모르겠지만 뻗을 겁니다.
text의 위치가 0x0가 되면 일단 뻗고, entry가 main이 되면 종료할때 뻗습니다.
저도 OSRC에서 공부중 답글 드립니다.
오래된 질문이지만 타인을 위해 답변드립니다.
저또한 windows 환경에서 cygwin을 사용해서 작업중 같은 난관에 봉착했습니다.
위의 님의 답변을 따라 컴파일 과정을 따라가 보니 collect2 에 생소한 링크가 있더군요 -lcygwin이라는..
결국
ld -o test -Ttext 0x0 -e main test.o -lcygwin
으로 링크 해결은 봤습니다만
-e main 옵션으로 엔트리 포인트를 찾지 못하는 불상사가..그래서 그냥 지워버리고
ld -o test -Ttext 0x0 test.o -lcygwin
으로 정리했습니다.
ndisasm 역시 OSRC예제와는 조금 많이 다르게 어셈블러 코드가 상당히 길고(비록 30줄내외로 ret포인트가 있지만, 그 밑으로도 여러 쓸데없는듯한 어셈들이 많이 있다는..) 종잡을수 없지만..
아무튼 대충적으로는 넘어갈수있는 상태인듯..
댓글 달기