개발자 노트

C언어의 함수를 어셈블리어와 연계할 때 어셈블리어에서만 함수 앞에 언더바를 붙이는 이유 본문

▶ INBOX ◀

C언어의 함수를 어셈블리어와 연계할 때 어셈블리어에서만 함수 앞에 언더바를 붙이는 이유

heeyam 2016. 9. 29. 10:55
반응형

Q. C언어의 함수를 어셈블리어와 연계할 때 어셈블리어에서만 함수 앞에 언더바를 붙이는 이유

어셈블리어로 c 라이브러리를 만들 때

함수명은 동일하나 어셈블리어에서는 함수명 앞에 언더바를 붙이는 이유가 궁금했다.


[예시] 만약 c언어 함수가 void io_hlt(void)일 경우

--------어셈블리어 파일에서의 함수명----------

_io_hlt

----------------------------------------------------


A. 이유는 컴파일 과정의 linkage 때문이다.

[상세설명]

우선 어셈블리어 함수명 앞에 _(언더바)를 붙여주는 이유는 c에서 호출할 수 있도록 하기 위해서이며

언더바를 붙이지 않은 함수는 어셈블리어끼리만 호출하도록 한다는 의미가 된다.

그렇기 때문에 어셈블리어에서는 c언어의 함수나 전역변수 이름 앞에 언더바를 사용한다.

즉, c에서 io_hlt()로 선언하면 컴파일러는 그것을 컴파일 할 때 _io_htl() 형태로 변환한다.


그럼 왜 컴파일 할 때 이름의 형태가 변하는 것인가?

그것은 linkage 때문이다.

linkage는 쉽게 설명하면 컴파일 시 함수명이나 변수명 등의 앞 또는 뒤에 _(언더바) 등의 심볼을 덧붙이는 것을 말한다.

C와 C++은 컴파일시 오브젝트 파일에 함수명, 변수명 등에 심볼을 기록하는 방식이 다른데, 이 때문에 'extern C' 라는 것이 이용된다.


이해가 안되거나, 잘못된 정보가 있으면 댓글 남겨주세요 :)


반응형

'▶ INBOX ◀' 카테고리의 다른 글

word 단축키  (0) 2016.10.04
메모리 번지 지정시 세그먼트 레지스터 사용  (0) 2016.09.29
부트로더에 대한 이해  (0) 2016.09.27
BIOS 설명 및 CMOS 셋업  (0) 2016.09.27
OS 개발 코드 분석  (0) 2016.09.27
Comments