2012-09-18 2 views
0

큰 라이브러리 liblarge와 liblarge에 링크하는 응용 프로그램이 있다고 가정 해 보겠습니다.특정 기능을 사용하는 Gcc 데드 코드 제거

라이선스는 LGPL 라이선스에 의거하며 앱은 독점적 인 라이선스를받습니다. 나는 인 liblarge에서 모든 "dead code"를 제거하고 싶습니다.에서 사용하지 않았습니다. 어떻게 든 할 수 있을까요? 아마도 링커에게 사용 된 함수의리스트를 제공 할 것인가?

+0

liblarge를 정적 라이브러리로 컴파일하고 * .a에 링크하십시오. GCC 참조에서 C 또는 C++ 응용 프로그램이라고 가정합니다. ABI가 단일 * .o를 작동시키는 방식의 특성으로 인해이를 분해 할 수있는 가장 작은 단위입니다. –

+0

예, 확실히 죽은 코드를 제거 하겠지만, LGPL을 쉽게 준수 할 수 있도록 liblarge를 동적 라이브러리로 유지하려고합니다. – joe

답변

0

쉽게 진행할 수있는 방법이 없습니다.

당신은 * .o 제거 할 수있는 운동에 개인 복사본에 위의 기술 (내 의견에)을 사용할 수 있습니다. 그런 다음 DSO/DLL을 빌드하지만 필요가 없으면 링커 명령 행에서 DSO/DLL을 빌드하기 위해 * .o를 제거하는 자체 수정 된 liblarge 소스 트리를 빌드 할 수 있습니다.

이것은 C/C++가 작동하는 방식으로 코드가 오브젝트 코드로 변환되면 많은 정보가 손실됩니다.

예를 들어 각 * .o 파일의 크기를 줄이려고 할 수 있습니다. 이를 수행하는 주요 방법은 .c/ .cpp 편집 단위를 분리하는 것입니다.

C/C++ ABI의 문제점은 컴파일러가 * .o 파일의 임의의 위치에 코드를 놓은 다음 상대 오프셋을 사용하여 자유롭게 세그먼트 내외로 이동할 수 있다는 것입니다. * .o에 저장된 메타 데이터가 충분하지 않아 컴파일 된 코드를 분리하고 작동하는 데 필요한 모든 종속성을 볼 수 없습니다. 이렇게하려면 입력 소스 코드를 수동으로 분리해야합니다.

이것이 임베디드 소프트웨어 개발에서 메모리 풋 프린트가 중요한 요소였던 이유 중 하나는 말 그대로 파일 내부에 하나의 기능을 넣을 수 있었던 이유 중 하나입니다. 요즈음 임베디드 시스템은 많은 메모리를 가지고 있습니다.

관련 문제