8

특정 버전의 시스템 라이브러리에 링크되어있는 기존의 독점적 인 ELF 바이너리를 휴대용으로 만들 수있는 방법을 모색 중입니다. 이식성이란 동일한 프로세서 아키텍처와 호환 가능한 시스템 커널을 가진 모든 시스템에서 실행 파일이 라이브러리의 소스 코드를 갖지 않고도 작동한다는 것을 의미합니다 (소스 코드가 없어도 아무런 방법이 없으면 괜찮을 것입니다) .리눅스에서 독점적 인 ELF 바이너리를 이식 ​​가능하게 만들기

은 지금까지 나는 두 가지 가능성을 생각하지만, 나는 그들이 가능한 모든 경우 모르고, 그렇다면하여 선택하는 :

  1. 을 링크 된 모든 라이브러리와 그 종속성을 검색하고에 포함 서브 디렉토리에 저장하고 Library-Path를 해당 디렉토리로 변경하십시오.
  2. 프로그램이 체크섬에 따라 자체적으로 확인하지 않는 경우 라이브러리를 정적으로 이진 파일에 하나의 큰 실행 파일로 다시 연결합니다.

작성한 휴대용 프로그램을 배포하고 싶지 않으므로 라이센스는 문제가되지 않으며 개인적인 용도로만 사용됩니다.

답장을 보내 주셔서 감사합니다.

+0

http://stackoverflow.com/questions/2157636 | http://stackoverflow.com/questions/16250831 | http://stackoverflow.com/questions/15386027 –

답변

6

모든 링크 된 라이브러리 및 해당 종속성을 검색하여이를 바이너리의 서브 디렉토리에 포함시키고 Library-Path를 해당 디렉토리로 변경하십시오.

대부분의 공유 라이브러리를 작동,하지만 (대상 시스템이 새로운 충분한 버전이없는 경우 문제를 줄 가능성이 가장 높은 하나입니다) libc.so.6 작동하지 않습니다.

이유 : glibc는 200 개가 넘는 별도의 공유 라이브러리로 구성되어 있으며, 이들 사이에 버전이없는 바이너리 인터페이스가 있고 그 사이에 안정적인 ABI가 없습니다. 이 때문에 의 모든 부분은 동일한 빌드에서 가져와야합니다. 이 부분 중 하나는 libc.so.6입니다. 다른 하나는 ld-linux.so입니다. 후자에 대한 절대 경로는 모든 동적 실행 파일에으로 하드 코딩 된 입니다. 최종 결과 : libc.so.6의 사본을 제공하고 해당 사본이 시스템에있는 /lib/ld-linux*.so.2과 일치하지 않으면 매우 이상한 충돌이 발생하여 설명하거나 디버그하는 데 어려움이 있습니다.

라이브러리를 정적으로 이진 파일에 하나의 큰 실행 파일과 다시 연결합니다.

AIX 이외의 UNIX 시스템에서 작동하지 않을 수 있습니다

: 그들은 모두 a.out을 고려 foo.so는 더 이상 연결되지 않을 수 최종 링크 제품이 될 수 있습니다.

statifier이 존재합니다. 동적 인 외부에서 (거대한) 정적 실행 파일을 만듭니다. 나는 그것을 사용하는 경험이 없다.

+0

자세한 답변을 보내 주셔서 감사합니다. 나는 나중에 (GMT + 1) 화자를 시험해보고, 어떤 식 으로든 나를 도울 수 있는지 알아 보겠다. – FSMaxB

+0

애트리뷰트가 잘 작동하지 않는 것처럼 보이고 내 목표 (달성)를 달성 할 수있는 다른 소프트웨어가 독점적입니다. 그러나 적어도 내가 원하는 것을 성취 할 수있는 방법이 있습니다. – FSMaxB

+0

나는 Ermine을 시험해 보았고 시험 버전을 사용하여 잘 작동했다. – FSMaxB

관련 문제