ฉันจะรักษา glibc / gcc / … stack ที่แยกต่างหาก (ใหม่กว่า) ได้อย่างไรในรูปแบบที่ไม่ใช่รูทบน Linux


10

คลัสเตอร์การคำนวณของเรารัน CentOS เวอร์ชันเก่ามากโดยมีเคอร์เนลเก่า (2.6.18) และแน่นอน libs เก่าและไบนารี เนื่องจากการอัปเดตสิ่งทั้งหมดต้องการงานจำนวนมากบนโหนดทั้งหมดนี่ไม่ใช่ตัวเลือก

ฉันกำลังพยายามรวบรวมและใช้โปรแกรมที่ต้องการC++11และดังนั้นรุ่นที่ใหม่กว่าของgcc(และ / หรือclang) เนื่องจากฉันไม่ต้องการยุ่งกับระบบเลยฉันต้องการทำสิ่งนี้ในฐานะผู้ใช้ที่ไม่ใช่รูทในทรีไดเรกทอรีในเครื่อง

ปัญหาคือที่gccต้องใหม่glibcกว่าที่มีอยู่ในเครื่อง ดังนั้นผมจำเป็นต้องรักษาแยกรุ่นใหม่glibcในท้องถิ่นของฉันlib/ต้นไม้อาจจะเป็นตามที่อธิบายไว้ที่นี่

ที่ฉันหายไปคือวิธีการทำผม "ฝัง" เส้นทางของ libs ท้องถิ่นของฉันในทุกไบนารีที่จำเป็นเช่นgcc, g++ฯลฯ ? การตั้งค่า LD_LIBRARY_PATH กับแผนผังโลคัลของฉันlib/ทำให้ไบนารีระบบทั้งหมดไม่ทำงานอีกต่อไป ( ELF file OS ABI invalid) เพราะพวกเขาต้องการใช้ใหม่libm.so/ libc.soกับที่พวกเขายังไม่ได้รวบรวม

ดังนั้นเพื่อตัดมันขึ้น: อะไรคือวิธีการที่เหมาะสมในการรักษาใหม่กองพัฒนาท้องถิ่น (ที่มีglibc, gccฯลฯ ) ในแบบคู่ขนานกับระบบเก่าได้โดยไม่ต้อง messing รอบเป็นราก?

ตามคำถามด้านข้าง: การตั้งค่า LD_LIBRARY_PATH จะโพสต์เป็นโซลูชันทั่ว SE เมื่อแยกออกglibcมา สำหรับฉันมันทำให้เกิดข้อผิดพลาดด้านบนเมื่อฉันพยายามรันไบนารีระบบใด ๆ (เช่นls) มาทำไม ฉันทำอะไรผิดหรือเป็นพฤติกรรมที่ตั้งใจหรือไม่

คำตอบ:


10

คุณมีสามตัวเลือกโดยทั่วไป:

  1. ใช้ wrapper รอบ ๆ ไลบรารีของคุณซึ่งจะตั้งค่าLD_LIBRARY_PATHอย่างเหมาะสมจากนั้นเรียกใช้ไลบรารีที่ต้องการ - เช่น:

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. เชื่อมโยงกับ-rpath( -Wl,rpath) ซึ่งเพิ่มเส้นทางการค้นหาสำหรับตัวเชื่อมโยงแบบไดนามิกลงในไบนารี (โปรดดูคำตอบ SO - มันยังกล่าวถึง wrapper)

  3. คุณไม่ต้องการอ่านสิ่งนี้: อัปเดตคลัสเตอร์ของคุณ (ให้ความสำคัญกับ "ของคุณ") จะต้องทำวันหนึ่งหรือวันอื่นดังนั้นทำไมไม่วันนี้ "ไม่ใช่ตัวเลือก"ค่อนข้างแข็งแกร่งในกรณีส่วนใหญ่ ผู้ใช้รายอื่นอาจมีปัญหาเดียวกัน

สำหรับไบนารีเก่าที่มีปัญหา - ไบนารีมีตัวเชื่อมโยงแบบไดนามิกที่ต้องการฝังอยู่ในนั้น และตัวเชื่อมโยงแบบไดนามิกเก่าไม่เข้าใจ ABI ที่ใหม่กว่า path/to/your/ld-linux-<arch>.so binaryลองโทรไบนารีเช่นนี้:

การสร้าง GCC: คุณสามารถลองส่งออกได้CFLAGSในสภาพแวดล้อมการสร้างของ GCC - แต่ฉันแน่ใจว่าพวกเขาได้รับการเผยแพร่ Buildscripts ของการแจกแจงแบบต่าง ๆ อาจให้เบาะแสบางอย่างแก่คุณ (เช่น: สำหรับ openSUSE ดูรอบ ๆ บรรทัด 1880 ในไฟล์ . spec )


สวัสดีปีเตอร์ขอบคุณสำหรับคำตอบ ฉันชอบตัวเลือกที่ 2 อย่างไรก็ตามฉันจะ hardcode rpath ให้เป็นเช่น gcc โดยไม่ต้องเปลี่ยน Makefile เป็นต้นได้อย่างไร สำหรับการอัพเดทคลัสเตอร์: หลักสูตรนี้อยู่ในวาระการประชุมของเรา แต่ตอนนี้มีคนจำนวนมากเกินไปที่จะใช้คลัสเตอร์เพื่อปรับเวลาหยุดทำงานที่นานขึ้น นอกจากนี้สำหรับการอัปเดตเราจะว่าจ้าง บริษัท อีกครั้งเพื่อตั้งค่าเดิม ไม่มีใครในกลุ่มของเราที่มีความรู้และประสบการณ์เพียงพอสำหรับเรื่องนี้
janoliver

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

ในฐานะที่เป็นกลุ่มวิจัยขนาดเล็กในระบบวิทยาศาสตร์เยอรมันที่ด้อยโอกาสเราจึงไม่สามารถจ้างใครบางคนสำหรับงานนี้หรือลงทุนด้วยตนเอง คุณอาจจะถูกต้องว่าในระยะยาวสิ่งนี้อาจชำระคืน แต่ตอนนี้งบประมาณมีข้อ จำกัด เกินไปสำหรับบางสิ่งเช่นนี้ นี่คือข้อเสียของการไม่ได้อยู่ใน บริษัท ;)
janoliver

รับนักศึกษา IT / CS จากมหาวิทยาลัยของคุณ - นักศึกษาที่ดีอาจจะสามารถใช้สำหรับวิทยานิพนธ์ BSc / Msc ของเขา / เธอ และเกี่ยวกับการเงิน: จงดีใจที่คุณอยู่ในเยอรมนีและไม่ได้อยู่ในประเทศเพื่อนบ้านทางตะวันออกของคุณ (อาจยกเว้นออสเตรีย) :)
peterph

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