프로그램

정적 링크로 컴파일하면, 전체 용량이 줄어든다?

(주)CKBcorp., 2022. 2. 4. 17:08
반응형

어... 웃지말자. 실제로 주장한 사람이 있다.

예를 들어 

main.c  1k
libfoo.a 10k

libfoo.a 는 3개의 함수로 구성. 
libfoo.a:foo1() 2k
libfoo.a:foo2() 3k
libfoo.a:foo3() 5k

가 있다고 가정하자. 위의 1K 2K 3K 5K 10K 는 실행 바이너리 혹은 라이브러리 크기라고 보면 된다. 

자. main 함수에서 foo1 만 사용한다면,  이걸 static 으로 컴파일 할 때, 실행파일의 총 크기는 11K ( = main.c 1K + libfoo.a 10K ) 가 아니라, 3k 가 된다는 주장이다. 그러니까 이 사람 논리는, static 으로 빌드를 하면 링커가 링크할 때 전체 라이브러리 파일을 실행파일과 합치는 게 아니라, 필요한 함수 부분의 바이너리만 잘라내서 합친다는 뜻. 과연 그럴까?

답은 그럴수도 있고, 아닐수도 있다. 

예를 들어, libfoo.a 가 단 한개의 foo.c 파일에서 만들어진 라이브러리고, foo1() foo2() foo3() 모두 하나의 파일에 기술된 함수라면, 정적 컴파일 옵션에서 최종 실행파일의 용량은 3K 가 나올 수 없다. 왜냐면 링킹 과장에서, lib 는 파일단위로 붙이거덩. 함수단위가 아니다. 즉 실행파일의 용량은 11K 가 나온다. 

그런데, 만일 libfoo.a 가 2개의 파일로 구성되어 있고, 그게 foo1.c foo2.c 이고, foo1.c 가 foo1() 이 들어있고, foo2.c 에 foo2(), foo3() 이 들어있다면, 이야기가 다르다. 

라이브러리 파일의 경우, 라이브러리를 구성하고 있는 모든 파일을 일렬로 쭉 세워서 붙여놓은 파일이다. 마치 압축 안한 tar 같은 느낌. 그렇기 때문에 static 으로 컴파일한다면, 사용하는 함수가 속한 파일 전체를 짤라오기는 하지만, 당연히 함수가 속하지 않은 파일 영역은 가져오지 않고, 그래서 용량이 변할 수 있다. 라이브러리 파일이 foo1.c foo2.c 의 두 개 파일을 합친 libfoo 라면, static 인 실행파일의 용량은 3K 가 된다. 


위 조건대로 파일 만들어서 테스트 해 보면 금방 알 수 있다. 문제는 이렇게 테스트 해서 가져다 바치지 않으면, 인정 안 한다는거. 내가 을이라 어쩔 수 없음.

반응형