2010-11-22 6 views
13

팀 프로젝트가 개발되는 방식으로 모든 .o 오브젝트 파일에서 애플리케이션 용 공유 객체 라이브러리를 생성합니다. 내 작업 (충분히 구체적이지만 다른 사람들이 사용하기에 충분히 일반적이기도하다!)은 마지막으로 실행 파일을 만든 이후로 변경된 개체 파일에만 연결하는 것입니다. 예를 들어 .so를 빌드하는 데 사용하는 명령 줄은 다음과 같습니다.리눅스에서 gcc를 사용하여 점진적으로 링크하기. 가능한가?

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so 

예상대로 작동합니까? :) 내 목표는 동시 연결 프로세스의 속도를 높이기 위해 지금부터 변경된 개체 파일 만 연결할 수 있도록하는 것입니다. 예 명령은 다음과 같습니다 또한 libMySharedLibrary.so에서 기존의 오브젝트 파일을 유지하면서, 새로운 오브젝트 파일과 libMySharedLibrary.so을 업데이트

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so 

. 실제로 위의 명령을 사용하여 libMySharedLibrary.so을 생성하면 파일 크기가 모든 개체 파일이 포함 된 파일 크기보다 훨씬 작아서 위의 명령이 내가 원하는 것을 수행하지 못한다는 것을 거의 확신 할 수 있습니다.

내 연구를 통해 -i 링커에 대한 옵션이 있는데,이 옵션은 모든 개체 파일을 하나의 큰 개체 파일로 결합하는 것처럼 보이는 -r 옵션과 동일합니다. 불행히도 이것이 내가 원하는 것 같지는 않습니다.

즉, 초기 링크 이후에 변경된 오브젝트 파일에만 링크를하고 싶습니다. 따라서 향후 링크에 대한 링크 프로세스가 빨라집니다. 이것을 할 수있는 방법이 있습니까?

편집 : -i/-r로 시도했다의 예 :

예 명령 : 나는 그것을 필요에 대해 나에게 고함을 중지 할 수 -nostdlib 태그를 추가했고, g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

-shared 제거 -r 태그에서는 공유 객체가 허용되지 않기 때문입니다.

이 명령은 모든 .o 파일을 하나의 큰 .o 파일로 슬래 밍하는 것처럼 보입니다. 따라서 .o 파일 만 변경하면 여기에서 .o 파일 만 업데이트하면 좋을 것입니다. AllMyObjects.o가 처음 생성 된 후에는 다음 명령을 시도했습니다 : g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o하지만 훨씬 작아서 (파일 크기대로) AllMyObjects.o이 생성되므로 모든 오브젝트 파일을 가질 수 없다고 가정합니다. 나는 이것이 내가 작은 실수를 저 지르려고하는 것처럼 느낀다. 누구든지 조언을하나요? 미리 감사드립니다.

+0

링크 단계가 실제로 증분 빌드를 지배합니까? 그렇지 않다면, 왜 귀찮게합니까? – dmckee

+0

'-i' /'-r'로 시도한 것을 보여줄 수 있습니까? 심볼 충돌 ('대체'옵션이 없다는 것을 고려해보십시오)이 실행되기를 기대하지만 * 원하는 옵션입니다. –

+0

링크 단계는 내 빌드에서 가장 시간이 많이 걸리는 부분이 아닙니다. 그러나 이것은 팀 리더가 내게 주었던 임무입니다. 우리는 이미 변경된 것을 컴파일하는 것만으로도 충분합니다. 현재 우리는 변경된 사항 만 컴파일하고 매번 모든 단일 오브젝트 파일을 다시 링크합니다. –

답변

6

마치 과 -r이 함께 작동하지 않는 것 같습니다. 나는 이전 GCC 버전에 대한 회의적 이었지만, 심지어 우분투 10.10에 나는 같은 볼 수 있습니다 : 불행하게도

$ ld -shared -r 
/usr/bin/ld.bfd.real: -r and -shared may not be used together 

, 당신은 당신이 절대적으로 공유 객체를 필요로하는 경우 막 다른 끝에 도달 한 것을 의미한다. binutils 링커는 단순히 그것을 구현하지 않습니다.

정적 라이브러리가 옵션 인 경우 해당 파일은 간단히 ar 유틸리티로 쉽게 조작 할 수있는 아카이브입니다.

그렇지 않으면 다른 링커 또는 컴파일러 제품군을 살펴야합니다. 이 기능을 찾을 수 있다고 보장 할 수는 없지만 이국적인 것 같습니다.

+0

확인. 신속하게 답변 해 주셔서 대단히 감사합니다. 팀 리더와 확실히 이야기하고 정적 라이브러리를 사용하는 것이 옵션인지 확인합니다. 또한 내 연구에서 나는 구글에서 Ian Lance Taylor가 개발 한 "gold"라고하는 대체 링커를 발견했습니다. 그것은 2008 년 3 월에 binutils에 추가되었습니다. 이것 또한 들여다 볼 수 있습니다. 기본 링커를 사용하여이 작업을 수행 할 수있는 방법이 있기를 바랬지 만 그 경우에는 나타나지 않습니다. 다시 귀하의 도움에 감사드립니다! –

+3

'gold'가 설치되어있는 것처럼 보이지만'gold-shared -r'도 같은 결과를 낳습니다. –

+0

하하 물론 그렇습니다. :) 당신의 도움에 다시 한번 감사드립니다. –

3

아카이브/정적 라이브러리를 사용한 후 동작을 정렬 할 수 있지만 초기 링크에는 여전히 동일한 시간이 소요됩니다.

아카이브 파일을 사용 : 내가 말했듯이

# Initially create the archive 
ar r libmylib.a <all object files> 

# Create your shared object (re-use this line after libmylib.a is updated) 
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so  

# Update the archive file 
ar r libmylib.a updated1.o updated2.o 

, 그것은 여전히 ​​이전처럼 실제로 .so을 연결하는 동일한 시간이 소요됩니다.