การเอาชนะไลบรารีลินุกซ์สำหรับเครื่องมือไบนารีเท่านั้นในอดีต


2

ฉันมีกล่อง Ubuntu Linux 64 บิต เมื่อเร็ว ๆ นี้ฉันได้รับไบนารีคอมไพล์เก่าที่เคยใช้กับเซิร์ฟเวอร์เก่าที่เลิกใช้แล้วซึ่งฉันคิดว่าเป็นการแจกจ่าย Redhat ยุค 2007

อย่างที่คุณคาดไว้ไบนารีไม่ทำงานเนื่องจากความไม่เข้ากันของไลบรารี ไบนารีเท่านั้นที่ดูดและไม่ได้หมายความว่าเป็นแบบพกพา ถึงกระนั้นฉันยังคงติดอยู่กับเพียงไบนารีและจำเป็นต้องเรียกใช้ ดังนั้นคำถามของฉันจะกลายเป็นวิธีการจัดการกับปัญหา (เจ็บปวด) ของการหาสิ่งที่ห้องสมุดคาดหวังไบนารีการค้นหาห้องสมุดเหล่านั้นและบังคับให้โปรแกรมใช้พวกเขา กลยุทธ์ที่เหมาะสมในการทำสิ่งนี้คืออะไร?

ฉันจะให้คุณตัวอย่างที่เฉพาะเจาะจงของไบนารีของฉันซึ่งทำงาน แต่ล้มเหลวทันทีด้วยข้อผิดพลาด

datab2txt: relocation error: /lib64/libnss_files.so.2: symbol __rawmemchr, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference

ฉันสนใจในกลยุทธ์ในการวิเคราะห์ปัญหานี้เนื่องจากฉันคาดหวังว่าหากฉันแก้ปัญหานี้ (โดยการค้นหา glibc เวอร์ชันเก่า) อาจมีไลบรารีที่จะแก้ไขได้อีก

กลยุทธ์ที่ดีที่สุดในการแก้ไขปัญหานี้คืออะไร ฉันคาดเดาว่าฉันจำเป็นต้องระบุไลบรารีที่ต้องการ (อย่างไร?) ค้นหาพวกเขาและบังคับให้โปรแกรมใช้พวกเขา (จะเป็นอย่างไรแทนที่ LD_LIBRARY_PATH?)

ขอบคุณ!

แก้ไข: ใช้ให้เกิดข้อผิดพลาดldd datab2txt not a dynamic executableเอ่อ .. หมายความว่าไง?

นอกจากนี้ฉันเรียกใช้ไฟล์และรับ:

% file datab2txt

datab2txt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.4.0, not stripped

นั่นเก่ามาก คุณมีโชคเล็กน้อยเนื่องจากมีการเชื่อมโยงแบบคงที่ แต่เขียนเพื่อเคอร์เนลรุ่นเก่า (2.4) ไม่มีวิธีที่คุณจะได้รับซอร์สโค้ดหรือไม่? หรือเพียงแค่หาสิ่งที่มันทำและทำซ้ำกับสคริปต์บางอย่าง?
Keith

คำตอบ:


0

lddระบุห้องสมุดจะทำด้วย การค้นหาพวกมันเป็นปัญหาอื่น แต่ลองขุดลงไปpackages.ubuntu.comเพื่อดู Ubuntu รุ่นเก่า จากนั้นคุณดูที่การคลายแพ็กเกจด้วยตนเองและติดตั้งอ็อบเจ็กต์ที่แบ่งใช้ลงในไดเร็กทอรีเฉพาะของตนเอง (หรือแผนผังไดเร็กทอรีหากจำเป็น) และใช้LD_LIBRARY_PATHเพื่อชี้ไปที่พวกเขา (หมายเหตุ: การใช้apt-getหรือdpkgไม่ได้ผลและหากคุณพยายามบังคับให้ออกจากระบบคุณอาจทำให้ระบบล่มไม่ต้องทำ)


0

คุณโชคดีที่มีคำสั่งในการค้นหาว่าไลบรารีใดที่ต้องการไบนารี่โดยมีเวอร์ชันที่ต้องการ:

ldd -v /path/to/binary

0

ในทางทฤษฎีแล้วการใช้chrootควรทำเคล็ดลับในการใช้งานซอฟต์แวร์ - หนึ่งในสถานการณ์ที่ออกแบบมาเพื่อรันซอฟต์แวร์ที่ไม่รองรับ, เก่าที่ไม่รองรับ ABI - คุณอาจต้องใช้กล่องเก่าเพื่อคัดลอกไลบรารี่ที่ต้องการจากหรือค้นหาและ รวบรวมห้องสมุดที่จำเป็นด้วยตัวคุณเอง


0

คุณมีไบนารีคงที่ โดยทั่วไปนี่หมายถึงไลบรารีทั้งหมดได้รับการคอมไพล์และไบนารี่ไม่มีการพึ่งพาจากภายนอก อย่างไรก็ตามมีข้อยกเว้นหากโปรแกรมใช้ไลบรารี NSS (libnss)

จากhttps://gcc.gnu.org/ml/gcc/1998-12/msg00083.html :

{AJ} NSS (สำหรับรายละเอียดเพียงพิมพ์ `info libc" สวิตช์บริการชื่อ ") จะทำงานไม่ถูกต้องหากไม่มีไลบรารีที่แชร์ NSS อนุญาตให้ใช้บริการต่าง ๆ (เช่น NIS, ไฟล์, db, hesiod) โดยเพียงแค่เปลี่ยนหนึ่งไฟล์การตั้งค่า (/etc/nsswitch.conf) โดยไม่ต้องทำการเชื่อมต่อโปรแกรมใด ๆ ข้อเสียเพียงอย่างเดียวคือตอนนี้ห้องสมุดคงต้องเข้าถึงห้องสมุดสาธารณะ สิ่งนี้ถูกจัดการโดยไลบรารี GNU C อย่างโปร่งใส

คุณจะเห็นคำเตือนต่อไปนี้หากโปรแกรมใช้ NSS และคุณพยายามรวบรวมแบบคงที่

> gcc t.c -Wall -static -o hostname -DWITH_NSS
/tmp/cco4Lcky.o: In function `main':
t.c:(.text+0x66): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

ฉันไม่แน่ใจว่ามีวิธีง่ายๆในการแก้ปัญหานี้หากคุณมีไบนารี แน่นอนคุณสามารถพบการกระจาย Linux กับ glibc ที่เก่ากว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.