소스 코드를 사용할 수없는 동적 실행 파일에서 정적을 만드는 오픈 소스 방법이 있습니까?


20

예를 들어 문제를 설명하겠습니다. 나는 xfigpdfedit 와 같은 일상적인 작업에서 오래된 프로그램을 사용 합니다.

이제이 프로그램은 상당히 오래되었으며 너무 자주 업데이트되지 않습니다. 내 두려움은 언젠가는 라이브러리가 없거나 호환되지 않는 업데이트로 인해 더 이상 작동하지 않을 것입니다.

실행중인 시스템 에서 프로그램을 지금 쉽게 컴파일 할 수 있다면 해결책이 편리합니다. 소스를 해킹하고 정적으로 컴파일하십시오. 가까운 미래 (1). 이것은 사실 인 것 xfig같으며 가능한 한 빨리 시도 할 것입니다.

그러나 예를 들어 pdfeditQt3에 의존하고 있으며 컴파일을 위해 시스템을 설정하는 것은 현재 매우 복잡합니다. 다행히도 필요한 라이브러리가 다른 라이브러리와 충돌하지 않기 때문에 지금 실행할 수 있습니다 . 그러나 이것은 미래에 바뀔 수 있으므로이 문제를 해결하고 싶습니다.

Ubuntu에 동적 라이브러리와 모든 라이브러리가 있지만 소스 코드가없는 경우 정적 바이너리 (또는 유사한 것)를 어떻게 만들 수 있습니까?

나는 주변을 수색했다. 한 가지 가능성은 statifier (2)이지만 주소 무작위 화에 많은 문제가 있기 때문에 아니오입니다. 무료 버전 인 Ermine 이 작동하는 것 같지만 오픈 소스 옵션을 선호합니다.

다른 가능성은 도커 또는 유사한 패키징 시스템을 사용하는 것입니다. 그러나 내가 찾은 모든 튜토리얼은 꽤 RedHat 지향적입니다 . 그리고 정직하게 따라 가기에는 상당히 복잡합니다.


각주 :

(1) 그렇게 미쳤어 요. 예를 들어 정적 ffmpeg 를 사용하고 호환성 문제없이 작동합니다 ...

(2) 컴파일 statifier하려면 /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error를 참조 하십시오.

답변:


19

다른 간단한 방법으로 문제를 해결할 수 있습니다.

ldd실행 파일에서 링크 된 라이브러리를 보려면 다음과 같이 사용하십시오 .

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

그런 다음 폴더에서 모든 라이브러리를 수집하고이 폴더를 가리 키도록 프로그램을 실행하기 전에 LD_LIBRARY_PATH 환경 변수를 설정하십시오.

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

또는 lib 폴더에 대한 항목을에 추가 할 수 있습니다 /etc/ld.so.conf.d/. 그러나 그것은 시스템 전체에 변화를 적용 할 것입니다.


이것은 좋은 아이디어입니다. ---이 모든 것을 실행 파일로 패키징하는 방법을 찾고 싶습니다. 이 솔루션은 로더 변경으로 인해 영향을받을 수 있습니다 (비 역 호환 방식으로 아무도 그런 일을하지 않기를 바랍니다). 더 나은 해결책이 없다면 현상금을 수여합니다 --- 감사합니다.
Rmano

작은 설치 스크립트에 이것을 추가하고 로컬 경로에 연결할 수 있습니다. 나는이 솔루션을 좋아하고 그것을 다시 사용할 수있었습니다.
WalyKu

1
@ 클라우스, linux-vdso.so.1 아무데도 보이지 않습니다. 커널에 있다고 가정합니다. 맞습니까?
Rmano

1
예. From man 7 vdso: ""vDSO "(가상 동적 공유 객체)는 커널이 모든 사용자 공간 응용 프로그램의 주소 공간에 자동으로 매핑되는 작은 공유 라이브러리입니다."
클라우스 D.

이것은 엄격하게 질문에 대한 답변 은 아니지만 합리적인 해결 방법입니다. 감사.
Rmano

2

statifier 에 관한 한 가지 제안 :

ASLR (Address Space Layout Randomization)으로 인해 오류가 발생하는 경우 전체 시스템에 대해 주소 공간 레이아웃 무작위 화를 해제 할 필요는 없습니다. 해당 프로세스에 대해서만 끌 수 있습니다.

$ setarch `uname -m` -R statified_pdfedit [args...]

무작위 레이아웃이 비활성화 된 상태에서 해당 명령을 실행합니다 (루트 일 필요는 없음).


와우, 흥미 롭군 만약 내가 방금 컴파일 할 수 있다면 statifier...
Rmano

컴파일하고 확인했습니다. xfig_statified여전히 코어 덤프 ... 아쉽습니다. 어쨌든 고마워
Rmano

예, 동정입니다 64 비트 문제가 아닌지 궁금합니다 .32 비트 설정에서 통계를 실행 해보십시오.
lemonsqueeze

여전히 코어 덤프 인 32 비트 시스템에서 점검되었습니다.
Rmano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.