개발자 노트
C언어의 함수를 어셈블리어와 연계할 때 어셈블리어에서만 함수 앞에 언더바를 붙이는 이유 본문
반응형
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