2009-06-20 3 views

답변

10

예. 정적으로 링크 된 실행 파일을 작성하려면 정적 라이브러리가 필요합니다.

정적 라이브러리는 컴파일 된 개체의 번들입니다. 정적으로 라이브러리에 링크하면 라이브러리의 컴파일 결과를 가져 와서 현재 프로젝트에서 압축을 풀고 자신의 오브젝트 인 것처럼 사용할 수 있습니다.

동적 라이브러리는 이미 연결되어 있습니다. 이것은 재배치와 같은 일부 정보가 이미 고쳐지고 폐기되었음을 의미합니다.

또한 동적 라이브러리는 위치 독립적 코드로 컴파일해야합니다. 이것은 정적 라이브러리에 대한 제한 사항이 아니며 x86과 같은 일부 공통 플랫폼에서 성능에 상당한 차이가 있습니다.

ELF Statifier과 같이 동적으로 링크 된 라이브러리를 동적으로 링크 된 실행 파일로 묶는 도구가 있지만 모든 상황에서 올바르게 작동하는 결과를 생성하는 것은 매우 어렵습니다.

+1

좋은 답변 주셔서 감사합니다. 그러나 왜 그렇게 어려운가? –

+2

ELF Statfier는 실행 파일과 모든 라이브러리를로드 한 다음 프로세스 메모리의 스냅 샷을 가져옵니다. 출력 이미지가 실행되면 메모리 레이아웃이 변경되는 요소 (예 : 무작위로 추출한 VDSO)가 올바르지 않습니다. 다른 접근법은 동적 링커를 다시 발명해야합니다. – ephemient

+1

동적 링커를 다시 구현하는 것이 왜 어려운가요? 재배치 될 도서관의 수입과 수출에 관한 두 개의 테이블 만있는 것이 아닌가? 링커이기 때문에 이미 정적 링커를 구현하고 있으며 실행 파일과 동적 라이브러리 등의 파일 형식을 알고 있습니다. – ChrisW

6

정적 컴파일과 같은 것은 없으며 정적 연결 만 있습니다. 그리고이를 위해서는 정적 라이브러리가 필요합니다. 정적 링크와 동적 링크의 차이점은 전자의 경우 링크 타임 (컴파일 타임 직후)에서 이름이 결정되고 후자와 함께 이름이 결정되며 프로그램 실행과 마찬가지로 해결됩니다.

정적 및 동적 라이브러리에는 많은 요인에 따라 동일한 정보가 포함되어 있거나 포함되어 있지 않을 수 있습니다. 코드를 정적 또는 동적으로 링크 할 것인지 여부를 결정하는 것이 중요한 것이며, 종종 응용 프로그램 아키텍처에 영향을줍니다.

+0

'컴파일'을 '링크'로 수정했습니다. –

2

정적으로 링크 된 프로그램에 링크하는 모든 라이브러리는 정적 변형이어야합니다. 동적 (libfoo.so) 및 정적 (libfoo.a) 라이브러리는 동일한 함수를 가지지 만 형식이 서로 다르므로 프로그램에 맞는 유형이 필요합니다.

1

또 다른 옵션은 Ermine (http://magicErmine.com) 입니다. 이것은 메모리와 무작위 화를 처리 할 수 ​​있습니다.

+0

훌륭한 제품입니다. 감사합니다. –

관련 문제