[완료] 최근의 C/C++ linker 는 smart linking 가 구현되어있나요?
글쓴이: free1002 / 작성시간: 목, 2008/05/15 - 4:21오후
(제가 구글링을 제대로 못해서 그런지 잘 못찾겠군요;;)
Pascal/Delphi 의 경우 smart linker 기능이 구현되어있어서 실행화일을 만들 경우 정적 라이브러리 내에서 실제로 쓰인 함수들만 링킹 때 포함되는 걸로 알고 있습니다. 그래서 같은 프로그램 대비 (그리고 사용하는 라이브러리에서 묶은 함수의 구성이 같은 경우) C/C++ 의 바이너리 화일보다 작다고 들었습니다. (C/C++ 의 경우 정적 링킹 시 함수 단위가 아닌 라이브러리를 묶은 오브젝트 화일 단위)
근데 저 이야기는 좀 예전 이야기로 알고 있어서요. 현재의 C/C++ 컴파일러/링커의 경우 smart linker 를 지원하는지 좀 궁금합니다.
Forums:
적어도 gcc 4.1.2에서는 지원하지 않는군요.
gcc 4.1.2에서 확인해 보니 static library를 생성했을 경우에만 object file 단위로 link되더군요.
object file을 다 명시해 줄 경우 함수의 사용 여부와 무관하게 모든 object file이 link됩니다.
결론적으로 gcc 4.1.2에서는 함수 단위의 제거 기능은 없는 것으로 보입니다.
dead code 제거
Option -ffunction-sections instructs gcc to place each function
(including static ones) in it's own section named .text.function_name
instead of placing all functions in one big .text section.
At link time, ld normally coalesce all such sections into one
output section .text again. It is achieved by having *(.text.*) spec
along with *(.text) spec in built-in linker scripts.
If ld is invoked with --gc-sections, it tracks references, starting
from entry point and marks all input sections which are reachable
from there. Then it discards all input sections which are not marked.
This isn't buying much if you have one big .text section per .o module,
because even one referenced function will pull in entire section.
You need -ffunction-sections in order to split .text into per-function
sections and make --gc-sections much more useful.
-fdata-sections is analogous: it places each global or static variable
into .data.variable_name, .rodata.variable_name or .bss.variable_name.
http://lwn.net/Articles/249005/ 에서 발췌
덕분에 좋은 정보를 얻었습니다. 감사합니다.
해당 옵션을 주고 컴파일 해 보니 object file 단위까지는 link가 되나 .text section에서 안쓰는
함수들이 제거되는군요.
좋은 정보 감사합니다.
좋은 정보 감사합니다.
처음에 저 부분을 읽었을 때는(smart linker 검색하다가 다른 웹 페이지에서 발견) 잘 이해가 안갔는데, 실험해보고 nm 과 objdump 을 돌려보고 나서야 이해했습니다. 링크랑 발췌해주신 내용이 더 이해하기 좋았습니다.
좋은 정보 감사합니다.
댓글 달기