programing

gcc -g vs not -g 및 스트립 vs strip vs strip, 성능 및 메모리 사용량?

javamemo 2023. 9. 12. 19:47
반응형

gcc -g vs not -g 및 스트립 vs strip vs strip, 성능 및 메모리 사용량?

바이너리 파일 크기가 문제가 되지 않는다면 성능이 중요한 환경에서 실행해야 하는 스트립 바이너리가 아니라 -g를 사용하는 단점이 있습니까?나는 디스크 공간이 많지만 바이너리는 cpu 집약적이고 메모리를 많이 사용합니다.바이너리는 한번 로드되고 몇 시간 동안 활성화됩니다.

편집:

디버깅 정보가 포함된 바이너리를 사용하고자 하는 이유는 세그먼트화 실패 시 유용한 코어 덤프를 생성하기 위해서입니다.

ELF 로더는 섹션이 아닌 세그먼트를 로드합니다. 섹션에서 세그먼트로의 매핑은 실행 파일을 작성하는 데 사용되는 링커 스크립트에 의해 결정됩니다.

기본 링커 스크립트는 디버그 섹션을 세그먼트에 매핑하지 않으므로 생략합니다.

심볼 정보는 두 가지 맛으로 제공됩니다. 정적 심볼은 대역 외로 처리되며 결코 섹션 데이터로 저장되지 않습니다. 동적 심볼 테이블은 링크러에 의해 생성되며 동적 링크러가 액세스할 수 있어야 하므로 실행 파일과 함께 로드되는 특수 세그먼트에 추가됩니다.strip명령은 세그먼트에서 참조되지 않는 정적 기호만 제거합니다.

따라서 전체 프로세스를 통해 전체 디버그 정보를 사용할 수 있으며 RAM의 실행 가능한 이미지 크기에는 영향을 미치지 않습니다.이것은 또한 코어 덤프에 정보가 포함되지 않는다는 것을 의미하므로 여기서도 이점을 얻을 수 없습니다.

objcopy유틸리티에는 디버그 정보만 복사할 수 있는 특별한 옵션이 있으므로 이 정보를 포함하는 두 번째 ELF 파일을 생성하고 제거된 이진 파일을 사용할 수 있습니다. 코어 덤프를 분석할 때 두 파일을 모두 디버거에 로드할 수 있습니다.

objcopy --only-keep-debug myprogram myprogram.debug
strip myprogram

언급URL : https://stackoverflow.com/questions/5936181/gcc-g-vs-not-g-and-strip-vs-not-strip-performance-and-memory-usage

반응형