When you invoke the link-editor directly, you have to supply every object
file and library required to create the intended output. The link-editor makes
no assumptions about the object modules or libraries that you meant to use
in creating the output. For example, the following command instructs the link-editor
to create a dynamic executable that is named a.out using only the input
file test.o.
$ ld test.o
Typically, a dynamic executable requires specialized startup code and exit processing code.
This code can be language or operating system specific, and is usually
provided through files supplied by the compiler drivers.
Additionally, you can also supply your own initialization code and termination code.
This code must be encapsulated and be labeled correctly for the code to
be correctly recognized and made available to the runtime linker. This encapsulation
and labeling can also be provided through files supplied by the compiler drivers.
When creating runt
gcc/cc 가 그간 알아서 해주던 entry point 설정 작업 등이. ld를 이용할 때에는 알아서 해야한다는 소리.
이미 다 아는 내용이겠지만.
많은 unix들이 실행파일을 만드는 최종 과정에서
main 함수를 호출하는 __start 함수를 가진 사전에 컴파일 된 crt.o 를 결과물에 합쳐준다.
cc a.c 를 수행하면 실제로는
cc -c a.c
ld a.o crt.o [기타옵션]
위의 두 명령이 실행되는 것이다.
ld a.o
라고 명령을 수행하면.
__start 함수가 없는 실행 파일을 만드므로 gnu ld는 경고를 내준다.
gld: warning: cannot find entry symbol _start; defaulting to 0000000000010058
entry point가 없으므로 기본 위치를 강제로 잡아주겠다는 경고.
(이 때문에 코드 수행은 되지만 calling convention에 의한 뒷처리가 빠져있어 segmantation fault가 발생하는 것으로 보인다.)
ld가 이 경고를 때려주지 않아서 한참 돌아온 듯 하네.
어쨋든, 시스템 설정 상 crt.o가 어디 있는지 파악하기도 그렇고, 특정 시스템에 종속되는 것은 특수한 상황이 아니면 바람직하지 않은 것일테니, gcc/cc로 링킹하자.