2010-11-26 2 views
0

우선 지난 며칠간 게시 된 내 질문에 따라 행했던 사람들에게 사과합니다. 이것은 -function-sections & -fdata-sections과 관련된 질문을하고 있었기 때문에 조금 반복적으로 들릴 수 있습니다.이 부분은 같은 줄에 있습니다. 그 질문들과 그 해답들이 내 문제를 해결하지 못했기 때문에 여기에서 완전한 문제를 진술하고 SO 전문가들이 그것에 대해 숙고하게하는 것이 최선이라는 것을 깨달았다. 그렇게 일찍 미안해해서 미안해. 나는이 기능을 많이 제공하는 정적 라이브러리의 집합을 구축사용하지 않는 기호가 최종 실행 파일에 링크되지 않도록하는 방법은 무엇입니까?

:

그래서 여기 내 문제를 간다. 이러한 정적 라이브러리는 많은 제품에 제공됩니다. 모든 제품이 내 라이브러리에서 제공하는 모든 기능을 사용하지는 않습니다. 문제는 라이브러리 크기가 상당히 크고 제품이 축소하려는 경우입니다. 주요 목표는 라이브러리 크기 자체가 아닌 최종 실행 파일 크기를 줄이는 것입니다.

이제 저는 연구를 수행하여 소스 파일에 4 개의 함수가 있고 그 중 하나의 함수 만 응용 프로그램에서 사용하는 경우 링커에서 나머지 3 개의 함수를 최종 파일에 포함한다는 것을 알았습니다 모두 동일한 오브젝트 파일에 속하기 때문에 실행 가능합니다. 더 자세히 분석해 보면 -function-sections, -fdata-sections 및 -gc-sections (이 옵션은 링커 옵션 임)은 하나의 함수 만 링크되도록 보장합니다.

하지만 내 제어 할 수없는 이유로 이러한 옵션을 사용할 수 없습니다.

링커가 엄격하게 필요한 기능 만 링크하고 다른 기능이 같은 개체 파일에 있어도 제외하도록하는 다른 방법이 있습니까?

다른 문제를 처리하는 방법이 있습니까?

참고 : 내 코드를 재구성하는 것은 레거시 코드이며 크기가 커서 거의 제외됩니다.

주로 VxWorks & GCC를 다루고 있습니다.

도움 주셔서 감사합니다.

+1

http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/6265551762d9550e이 짧은 토론은 사용자가 요청한 것과 동일한 질문입니다. 컴파일러가하는 것과 링커가하는 일에 대해 깊이있게 알아보십시오. 관심있어. – vpit3833

답변

3

궁극적으로 원하는 기능 만 링크되도록하는 유일한 방법은 라이브러리의 각 소스 (개체) 파일이 파일 당 하나의 (표시) 함수 인 하나의 기능 기호 만 내보내는 것입니다. 일반적으로, 함께 사용되는 여러 함수, 즉 패키지의 초기화 및 종료 함수를 내보내는 일부 파일이 있습니다. 또한 소스 파일 (객체) 외부에서 볼 필요가없는 내 보낸 함수에서 사용하는 함수가 종종 있습니다 -이 파일이 static인지 확인하십시오.

Plauger의 "The Standard C Library"을 보면 파일이 4 줄 길이로 끝나는 경우에도 모든 기능이 별도의 파일로 구현된다는 것을 알 수 있습니다 (하나의 머리글, 하나의 기능 줄, 열린 중괄호, 한 줄 코드 및 닫기 중괄호).


제이 질문 :

큰 프로젝트의 경우

, 그것은 너무 많은 파일을 관리하는 것이 어려워지는 문제가 생기지 않는다? 또한이 모델을 따르는 많은 오픈 소스 프로젝트를 찾지 못했습니다. OpenSSL은 한 가지 예입니다.

널리 사용 된 것은 아닙니다. 그렇지 않습니다. 그러나 바이너리가 최소화되도록하는 방법입니다.컴파일러 (링커)는 당신을위한 최소화를하지 않을 것입니다 - 적어도, 나는 그것이 무엇인지를 알지 못합니다. 대형 프로젝트에서는 일반적으로 모두 함께 사용되는 밀접한 관련 기능이 단일 소스 파일에 그룹화되도록 소스 파일을 디자인합니다. 간혹 사용되는 함수는 별도의 파일에 저장해야합니다. 이상적으로, 거의 사용되지 않는 함수는 각각 자신의 파일에 있어야합니다. 작은 수의 파일을 작은 파일로 그룹화합니다. 그렇게하면 거의 사용되지 않는 함수 중 하나를 사용하면 제한된 양의 여분의 사용되지 않는 코드 만 링크됩니다.

파일 수에 관해서 - 그렇습니다. 기술은 많은 파일을 의미합니다. 최소한의 코드 크기를 고려하여 많은 파일을 관리 (명명)해야하는 부담을 덜어 야합니다. 자동 빌드 시스템은 대부분의 고통을 제거합니다. VCS 시스템은 많은 파일을 처리합니다.

또 다른 방법은 라이브러리 코드를 공유 객체 또는 동적 연결 라이브러리 (DLL)에 저장하는 것입니다. 그런 다음 프로그램은 공유 객체와 연결됩니다. 공유 객체는 메모리에 한 번만로드되고이를 사용하는 프로그램간에 공유됩니다. (상수가 아닌) 데이터는 각 프로세스에 대해 복제됩니다. 이렇게하면 디스크에있는 프로그램의 크기가 줄어들며로드 프로세스 중 픽스 업이 발생합니다. 그러나 실행 파일 크기에 대해 걱정할 필요가 없습니다. 실행 파일은 공유 객체를 포함하지 않습니다. 그리고 라이브러리를 사용하는 주 프로그램을 다시 컴파일하지 않고 라이브러리를주의 깊게 업데이트 할 수 있습니다. 실행 파일의 크기가 줄어들어 공유 라이브러리가 인기있는 이유 중 하나입니다.

+0

큰 프로젝트의 경우 너무 많은 파일을 관리하는 것이 어려워지지 않습니까? 또한이 모델을 따르는 많은 오픈 소스 프로젝트를 찾지 못했습니다. OpenSSL은 한 가지 예입니다. – Jay

관련 문제