GCC와 NASM 링크하는 방법. C코드와 어셈코드 링크
/* func.asm */
BITS 32
GLOBAL _io_hlt
SECTION .text
_io_hlt:
HLT
RET
/* End of func.asm */
/* test.c */
void io_hlt(void);
void main(void)
{
fin:
io_hlt();
goto fin;
}
/* End of test.c */
io_hit() 함수를 어셈블리어로 정의하고
test.c 소스에서 io_hit() 함수를 사용하고
이것들을 링커로 묶어서 최종 바이너리 파일로 만드려고 하는데
어떻게 해야하는지 잘 모르겠습니다...
어셈블러는 nasm으로 하고 컴파일러는 gcc 입니다.
플랫폼 환경은 mac(OS X) 입니다.
nasm -f elf -o factasm.o func.asm
gcc -o fact test.c factasm.o
이렇게 하려고 했는데
ld: warning: ignoring file factasm.o, file was built for unsupported file format ( 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ) which is not the architecture being linked (i386): factasm.o
Undefined symbols for architecture i386:
"_factorial", referenced from:
_main in main-8f8096.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
이러한 오류가 나오네요....
한번 -f elf 옵션은 -felf 로 바꾸어 보세여
https://www.hackthissite.org/articles/read/1079
보니까
-felf로 했던데
아니면
-felf32
로 해보는 것도 좋을듯
-hf
로 출력 포맷 볼수 있다는데
나오는 포맷을 보고 바꾸어보는게
즐린
일단 해결은 했으나...
nasm -f macho 옵션으로 맥(OS X)에서 바이너리로 변환에 성공했습니다.
현재 OS 만드는 것에 대한 책을 보고 있는데 -f macho 옵션으로 변환하는 것은 부트 섹터를 읽고 나서
-f macho로 변환한 루틴으로 진입시 치명적인 오류가 나타납니다...
이것을 해결하려면 gcc -S 옵션으로 어셈블리어 코드로 변환 후 이것을 저의 입맛에 맞게 변환시켜 줄 파서를 따로 만들어야 할 것 같네요...
아니면 이미 만들어진 오픈소스가 있으면 좋겠으나...
댓글 달기