Debian 배포판 전반에 걸쳐 단일 바이너리를 유지합니다.

Debian 배포판 전반에 걸쳐 단일 바이너리를 유지합니다.

현재 우리 시스템을 데비안 6에서 8로 마이그레이션하고 있습니다. 의제는 운영 체제 플랫폼(x86 기반) 전반에 걸쳐 단일 바이너리를 유지하려고 노력하는 것입니다.

그러나 Debian 6에서 Debian 8 컴파일 바이너리를 실행해 보았습니다. 밝혀지다

기호 조회 오류: g_thread_create

역방향으로 컴파일을 시도했는데 Debian 6 컴파일된 애플리케이션이 Debian 8에서 실행되었습니다.

대상 플랫폼은x86원자판.

데비안 8은 ldd다음을 보여줍니다:

linux-gate.so.1 (0xb76f5000)
libusb-1.0.so.0 => /lib/i386-linux-gnu/libusb-1.0.so.0 (0xb76c7000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb76ab000)
librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb76a1000)
libUFScanner.so => /usr/lib/libUFScanner.so (0xb751a000)
libUFMatcher.so => /usr/lib/libUFMatcher.so (0xb74f1000)
libjpeg.so.62 => /usr/lib/i386-linux-gnu/libjpeg.so.62 (0xb7492000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb73b9000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7237000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb70e5000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7099000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb6f41000)
libmorphosdk.so.6 => /usr/lib/libmorphosdk.so.6 (0xb6f1e000)
libMSO100.so.6 => /usr/lib/libMSO100.so.6 (0xb6f0e000)
libMSO_Drv.so.6 => /usr/lib/libMSO_Drv.so.6 (0xb6f06000)
libgtk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 (0xb6a0e000)
libgdk-x11-2.0.so.0 => /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0 (0xb694d000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6925000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0 (0xb68fc000)
libpangocairo-1.0.so.0 => /usr/lib/i386-linux-gnu/libpangocairo-1.0.so.0 (0xb68ee000)
libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb689c000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6753000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb66f5000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xb66ef000)
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb66ea000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65c2000)
libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb65bf000)
libftd2xx.so => /usr/lib/i386-linux-gnu/libftd2xx.so (0xb657c000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb648a000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6444000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6427000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb627d000)
libudev.so.1 => /lib/i386-linux-gnu/libudev.so.1 (0xb626a000)
/lib/ld-linux.so.2 (0xb76f8000)
libusb-0.1.so.4 => /lib/i386-linux-gnu/libusb-0.1.so.4 (0xb6260000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6243000)
liblzma.so.5 => /lib/i386-linux-gnu/liblzma.so.5 (0xb621a000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb61f4000)
libXcomposite.so.1 => /usr/lib/i386-linux-gnu/libXcomposite.so.1 (0xb61ef000)
libXdamage.so.1 => /usr/lib/i386-linux-gnu/libXdamage.so.1 (0xb61eb000)
libXfixes.so.3 => /usr/lib/i386-linux-gnu/libXfixes.so.3 (0xb61e4000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb602e000)
libpangoft2-1.0.so.0 => /usr/lib/i386-linux-gnu/libpangoft2-1.0.so.0 (0xb6016000)
libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb5fd3000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb5f22000)
libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb5f16000)
libXinerama.so.1 => /usr/lib/i386-linux-gnu/libXinerama.so.1 (0xb5f12000)
libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xb5eff000)
libXrandr.so.2 => /usr/lib/i386-linux-gnu/libXrandr.so.2 (0xb5ef2000)
libXcursor.so.1 => /usr/lib/i386-linux-gnu/libXcursor.so.1 (0xb5ee6000)
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb5ed1000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb5ea4000)
libthai.so.0 => /usr/lib/i386-linux-gnu/libthai.so.0 (0xb5e9a000)
libpixman-1.so.0 => /usr/lib/i386-linux-gnu/libpixman-1.so.0 (0xb5de0000)
libxcb-shm.so.0 => /usr/lib/i386-linux-gnu/libxcb-shm.so.0 (0xb5ddc000)
libxcb-render.so.0 => /usr/lib/i386-linux-gnu/libxcb-render.so.0 (0xb5dd1000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb5dc9000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb5d58000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb5d53000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb5d4d000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb5d25000)
libresolv.so.2 => /lib/i386-linux-gnu/i686/cmov/libresolv.so.2 (0xb5d0e000)
libharfbuzz.so.0 => /usr/lib/i386-linux-gnu/libharfbuzz.so.0 (0xb5cb1000)
libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb5c87000)
libdatrie.so.1 => /usr/lib/i386-linux-gnu/libdatrie.so.1 (0xb5c7e000)
libgraphite2.so.3 => /usr/lib/i386-linux-gnu/libgraphite2.so.3 (0xb5c62000)

데비안 6은 다음 ldd을 보여줍니다:

linux-gate.so.1 =>  (0xb7757000)
libusb-1.0.so.0 => /lib/libusb-1.0.so.0 (0xb773a000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7721000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7717000)
libUFScanner.so => /usr/lib/libUFScanner.so (0xb7590000)
libUFMatcher.so => /usr/lib/libUFMatcher.so (0xb7567000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb7547000)
libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0xb74bb000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7390000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb7273000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7227000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb70cf000)
libmorphosdk.so.6 => /usr/lib/libmorphosdk.so.6 (0xb70ac000)
libMSO100.so.6 => /usr/lib/libMSO100.so.6 (0xb709d000)
libMSO_Drv.so.6 => /usr/lib/libMSO_Drv.so.6 (0xb7094000)
libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb6d09000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb6c82000)
libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb6c66000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb6c4d000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb6c41000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb6bfd000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb6b88000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb6b4a000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb6b46000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb6b41000)
libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb6a78000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6a73000)
libftd2xx.so => /usr/lib/libftd2xx.so (0xb6a31000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb693b000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb6915000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68f7000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb67b0000)
/lib/ld-linux.so.2 (0xb775a000)
libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb67a8000)
libz.so.1 => /usr/lib/libz.so.1 (0xb6793000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb677a000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb6777000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb6774000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb676f000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb673f000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb6730000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb6727000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb6724000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb6716000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb670e000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb6705000)
libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0xb6669000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb6643000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb65cb000)
libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0xb6572000)
libpng12.so.0 => /lib/libpng12.so.0 (0xb654d000)
libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0xb6549000)
libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0xb6542000)
libpcre.so.3 => /lib/libpcre.so.3 (0xb650f000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb650c000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb6506000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb64e0000)
libresolv.so.2 => /lib/i686/cmov/libresolv.so.2 (0xb64cc000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb64b1000)

답변1

의견에서 말했듯이, 다양한 버전의 Debian(또는 모든 Linux 배포판)에서 실행되는 단일 바이너리를 빌드하는 신뢰할 수 있는 유일한 방법은 정적으로 빌드하는 것입니다. 이는 데비안과 pkg-config. 정적 바이너리는 수십 년 동안 계속 작동할 수 있습니다. 커널의 사용자 공간 인터페이스는 이전 버전과 호환되는 방식으로 유지됩니다(때로는 중단되지만 이는 버그로 간주되어 일반적으로 빠르게 수정됩니다). 정적 바이너리가 작동을 멈추는 상황을 발견할 수 있지만 이는 일반적으로 libnss처리(정적 바이너리에서도 동적임) 또는 X 서버 기대치의 변경과 관련이 있습니다(이는 다음과 같은 경우에 발생함).오래된 리눅스 게임) 또는 배포 커널이 더 이상 사용되지 않는 것으로 간주되는 기능에 대한 지원을 중단합니다(예를 들어Ubuntu 커널의 OSS 사운드 인터페이스).

(대안은 모든 종속 라이브러리를 제공하고 rpath쉘 스크립트를 사용하여 올바르게 설정하는 것입니다. 이것이 Steam이 수행하는 작업이며 Steam이 아닌 많은 Linux 게임도 수행하지만 정적 링크만큼 미래 보장형은 아닙니다. 문제가 발생하여 복구하기 어려울 때 더 유용합니다.)

Debian 6에 구축된 동적 바이너리는 바이너리의 직접적인 종속성이 여전히 사용 가능하므로 Debian 8에서 실행될 수 있습니다.귀하의 설치데비안 8은 순전히 운이 좋아서 의지할 수 있는 것이 아닙니다. 예를 들어, 바이너리는 에 연결되어 있습니다 libssl.so.0.9.8. 이전 패키지가 여전히 있으므로 Debian 8에서는 계속 작동합니다 libssl0.9.8(링크는 에 의해 충족됩니다/usr/lib/i686/cmov/libssl.so.0.9.8 ). 이전 패키지 없이 Debian 8에서 빌드하면 libssl.so.1.0.0데비안 6에서는 사용할 수 없는 링크가 생성됩니다 . (이것은 새로 설치된 데비안 8 시스템에서 끝나는 결과입니다.)

Debian 8에서 빌드한 바이너리가 Debian 6에서 실행되지 않는 것은 완전히 정상입니다. 바이너리 호환성은 내림차순이 아니라 오름차순입니다. 이는 Debian 6에서 바이너리를 빌드하고 여전히 Debian 8에서 해당 라이브러리를 찾으면 제대로 작동해야 한다는 것을 의미합니다. 그러나 Debian 8에 링크된 바이너리는 Debian 6에서 사용할 수 없는 라이브러리의 기호를 기대할 수 있습니다. 도서관의 이름을 변경합니다. 우려되는 오류는 해당 기호가 있는 g_thread_createDebian 8을 기반으로 구축하고 있지만 libglib-2.0.so.0Debian 6 libglib-2.0.so.0에는 없기 때문에 발생합니다. 바이너리가 포함된 패키지를 빌드하면 패키지의 종속성이 이를 올바르게 인식합니다(적어도 올바른 종속성을 얻게 됩니다 libglib2.0-0 (>= 2.31.8). Debian 6에는 버전 2.24.2만 있습니다).

미래에 대비한 설정을 위한 가장 좋은 방법은 Debian 6 및 8에서 충족할 수 있는 종속성을 갖춘 소스 패키지를 생성하는 것입니다. 그러면 Debian 6, 7, 8, 9에 대한 올바른 바이너리 패키지를 쉽게 빌드할 수 있습니다. 적어도 처음 몇 번은 정적 바이너리를 구축하는 것보다 조금 더 복잡하지만 앞으로 이러한 유형의 업그레이드를 수행할 계획이라면 장기적으로 그만한 가치가 있다고 생각합니다. 일반적으로 당신은pbuilder이를 위해 지원됩니다.다양한 배포판을 위해 구축됨(sbuild이 작업도 수행할 수 있습니다.) 데비안 6에 링크한 지침을 확장하는 것은 상대적으로 쉬울 것입니다(프로세스를 반복 STABLE_CODENAME하고 OLDOLDSTABLE_CODENAME다음을 사용하십시오).아카이브 저장소).

관련 정보