2016-10-13 4 views
-1

내 바이너리 및 모든 공유 라이브러리를 아카이브에 패키징하려고합니다. 나는 사용자가 이진 작업을하기 위해 아카이브를 추출하기를 원한다. 실행 파일은 셸 스크립트를 통해 시작됩니다. 여기서 LD_LIBRARY_PATH를 아카이브에 포함 된 공유 라이브러리 경로로 설정합니다.Linux C++ 휴대용 이진 문제

RHEL 6.7 배포판에서 처음으로 작동하도록 만들었으므로이 배포판으로 이진수를 컴파일 했으므로 테스트를 거쳤습니다. 문제는 RHEL 7.2에서 작동하게하고 (RHEL 6.7 작동 유지) 바이너리를 시작할 때 작동하지 않는다는 것입니다 ... glibc 기능 (충돌하지 않는 isspace와 인수). 이 두 RHEL 릴리스 뒤에 glibc 버전이 변경된 것을 볼 수 있습니다.

가 가
./XXX: ���:ELF: zR: Error 892688562 
가 이 ELF 오류 것으로 보인다

(자세한 존재 : 공유 라이브러리 GLIBC되지 않은이 아카이브에 포함 된 공유 라이브러리에서 , 그래서 그것을 추가하려고하고 지금 나는 다음과 같은 오류가 발생했습니다 내가 시작할 때마다), 나는 모든 공유 라이브러리를 확인하고 바이너리와 같은 x64 라이브러리이다. ... 많은 의존성이 있기 때문에 RHEL 7.2에서 컴파일하고 싶지 않다. 그것 모두를 컴파일하고, 또한 하나의 버전을 유지하는 것이 더 쉽습니다.

나는 Statifier와 Ermine과 같은 많은 것들을 시도했는데 둘 다 작동하지만 첫 번째 것은 버그가있어서 Address Space Layout Randomization을 비활성화하고 두 번째 것은 셰어웨어이고 나는 무료 솔루션을 선호한다. 또한 작동하는 CDE도 시도했지만 큰 패키지를 생성합니다. 다소 복잡합니다 ...

왜 이런 종류의 솔루션이 작동하고 수제 솔루션으로 작동하지 않습니까? 나는 잘하지 못한다.

는 ... 내가 오랫동안 검색하기 때문에 누군가가 나를 위해 솔루션을 희망 , 읽어 주셔서 감사

편집 : 내 쉘 스크립트처럼 전에 내가 해결책을 발견

:

# Binary location 
LOCATION=$(dirname $0) 
# Shared libraries directory 
BINDIR=${LOCATION}/bin/ 
# Changed shared library default location and launch binary 
${BINDIR}/ld-linux-x86-64.so.2 --library-path ${BINDIR} ${LOCATION}/XXX $* 
,536,913 :

# Binary location 
LOCATION=$(dirname $0) 
# Shared libraries directory 
BINDIR=${LOCATION}/bin/ 
# Define LD_LIBRARY_PATH 
export LD_LIBRARY_PATH=${BINDIR}:${LD_LIBRARY_PATH} 
# Launch binary 
${LOCATION}/XXX $* 

나는 변경

왜 그런지는 잘 모르겠지만 작동하는지, 누군가 제발 설명해 주실 수 있습니까? (ld-linux-x86-64.so.2는 RHEL 6.7 배포본에서 나온 것입니다.)

+1

나는 그렇게하려고 사람을 알고, Scientific Linux 5/6 iirc 포함. 그는 자신의 커스텀 glibc를 만들고 사용하는 것을 끝내었다. Linux 용 배송 바이너리는 재미 있지 않습니다. (내 DVD가 아니야.) –

+0

Btw, 대상 플랫폼의 묶음에 따라 서로 다른 바이너리를 작성하는 것은 llvm이하는 일이며, 이는 부당한 방법이 아닙니다. –

답변

0

나는 왜 그런지 잘 모르겠지만 누군가 제게 설명 할 수 있습니까?

설명은 here입니다. 당신의 해결책은 here으로 언급 된 "명시 적 로더 호출"입니다.

BTW, 이것은 잘못된 것입니다 : ${LOCATION}/XXX $* 대신이 작업을 수행해야합니다

${LOCATION}/XXX "[email protected]" 

(귀하의 변형이 제대로 공백으로 인수를 처리하지 않습니다.)