ใน LINUX กำหนดว่า. a library / archive 32-bit หรือ 64-bit?


87

เราแจกจ่าย lib แบบคงที่ใน Linux ทั้งในเวอร์ชัน 64 บิตและ 32 บิต เมื่อแก้ไขปัญหาลูกค้าฉันต้องการให้เชลล์สคริปต์การวินิจฉัยของฉันกำจัดปัญหาอย่างรวดเร็วโดยการตรวจสอบไฟล์. a archive เพื่อตรวจสอบว่าเป็น 32 หรือ 64 บิต วิธีการที่เกิดขึ้นกับฉันน้อยกว่าที่หรูหรา:

  1. แยกสมาชิก. o และถามคำสั่ง "ไฟล์" (เช่น ELF 32 บิตเป็นต้น)

  2. เริ่มต้นรวมสมาชิกจำลองที่เข้ารหัสเพื่อระบุเช่น 32bit.o / 64bit.o และใช้ "ar -t" เพื่อตรวจสอบ

ฉันได้ลองใช้ "strings xyz.a | grep 32" แล้ว แต่มันใช้ได้ไม่ดีในเวอร์ชันต่างๆ ไม่ใช่ปัญหาอกหัก แต่ถ้าคุณรู้วิธีแก้ปัญหาที่สวยงามฉันก็อยากจะรู้


ฉันรู้เกี่ยวกับstackoverflow.com/questions/184502/…กำลังมองหา soln ที่ดีกว่า
cvsdave

2
วิธีแก้ปัญหาในคำถามอื่นดูเหมือนจะแก้ปัญหาได้ค่อนข้างเรียบร้อย แต่วิธีที่รวดเร็วคือ nm foo.a | grep '^ 0' | หัว -1 | wc -c - ถ้าผลลัพธ์คือ 17 (16 + 1 == 8bytes + 1 char สำหรับการส่งคืนบรรทัด) เป็น 64 บิตถ้าเป็น 9 เป็น 32 บิต (8 + 1 == 4 ไบต์ + 1 อักขระสำหรับการส่งคืนบรรทัด)
Petesh

แล้วถ้าได้ 14 ล่ะ? o_0
Almo

คำตอบ:


123

objdump ดูเหมือนจะเป็นวิธีที่ดีที่สุด:

objdump -f libfoo.a | grep ^architecture

1
fileอ่านง่ายกว่าตามที่ระบุไว้ด้านล่างstackoverflow.com/a/8909086/233906
Cerber

1
ฉันเข้าใจarchitecture: i386:x86-64, flags 0x00000039:.. หมายความว่าเป็นทั้งสองอย่าง .. ? ไม่น่าเป็นไปได้ โปรดช่วย: D
graywolf

10
@Paladin: นั่นคือ 64 บิต - สถาปัตยกรรม x86 อธิบายโดย objdump ว่าi386(IA32 เก่าธรรมดา), i386:x86-64(AMD64) และi386:x64-32( สถาปัตยกรรมX32 32-bit-address-space-in-long-mode)
คาเฟ่

1
แฟล็ก '-f' ใน 'objdump' ระบุเพื่อแสดงเนื้อหาของส่วนหัวไฟล์โดยรวมของไลบรารี 'libfoo.a' ผลลัพธ์จาก 'objdump' จะถูกส่งไปยังคำสั่ง grep ซึ่งค้นหาคำว่า 'สถาปัตยกรรม' อักขระ "^" หมายถึง "สถาปัตยกรรม" ควรขึ้นต้นบรรทัด
Luke Purnell

3
ทำความสะอาดและลบ dupes: objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u:)
legends2k

33

วิธีที่ง่ายที่สุดคือใช้คำสั่ง file

$file <.so file or .a file>

31
ในสภาพแวดล้อม msys นี่เป็นเพียง echos <file>: ar archive ปัจจุบันไม่ใช่สถาปัตยกรรมเป้าหมาย
สโคน

11
เช่นเดียวกันในสภาพแวดล้อม Linux (Ubuntu) ปัจจุบันของฉัน
Asherah

4
เช่นเดียวกันใน centos7
Chaim Geretz

ใช้งานได้ดีบน Ubuntu 16.04 (1) file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped. (2) file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi

5
ไฟล์. so และไฟล์. a ไม่ใช่สิ่งเดียวกัน การแสดงว่าสิ่งนี้ใช้ได้กับไลบรารีที่แชร์ไม่เหมือนกับการแสดงว่าทำงานกับไลบรารีแบบคงที่ คำถามเดิมเกี่ยวกับไลบรารีแบบคงที่ (ไฟล์. a) ในกรณีของฉัน (ใช้ MSYS) โซลูชัน objdump ที่โพสต์โดย caf ทำงานโดยใช้ไฟล์เพียงแค่พิมพ์ 'ar archive' เหมือนกับที่สโคนได้รับ
Sean Burton

17

เพียงใช้คำสั่งไฟล์ กล่าวคือfile library.so


คำถามนี้มีไว้สำหรับไลบรารีแบบคงที่โดยเฉพาะ
pooya13

3

อ๊ะสิ่งที่ขาดหายไปหมายความว่ามีการแสดงหลายรายการ

ในคำตอบ:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

มันควรจะทำงานอย่างไร:

  • นาโนเมตร - รับสัญลักษณ์จากไลบรารี
  • grep - รับบรรทัดที่เริ่มต้นด้วยสตริงเลขฐานสิบหก (ที่อยู่ของสัญลักษณ์ในไฟล์)
  • หัว - รับบรรทัดแรก
  • sed - ลบทุกอย่างที่อยู่ในช่องว่างรวมทั้งช่องว่างด้วย
  • wc - นับจำนวนอักขระ

ในสภาพแวดล้อมที่ 32 บิตคุณได้รับที่อยู่สร้างขึ้นจาก 8 หลักหกเหลี่ยมเพิ่มบรรทัดใหม่จะช่วยให้คุณ9ในสภาพแวดล้อม 64bit คุณจะได้รับที่อยู่สร้างขึ้นจาก 16 17หลักหกเหลี่ยมเพิ่มบรรทัดใหม่จะช่วยให้คุณ


1
อาจต้องการโยน sed -e 's /. * //' ในนั้น
kowey

ฉันได้ 73 โดยวิธีการ สนใจที่จะอธิบายว่าทำไมจึงควรทำงาน?
Francesco Dondi

โอ๊ะสิ่งที่ขาดหายไปนั้นสำคัญ อัปเดตคำตอบพร้อมคำอธิบายว่าควรใช้งานอย่างไร
Petesh

1

หากมีฟังก์ชันเฉพาะสำหรับเวอร์ชันใดเวอร์ชันหนึ่งคุณสามารถลองใช้ nm แล้ว grep สำหรับฟังก์ชัน


คุณอาจสามารถเขียนโค้ดบางอย่างที่ค้นหาไบต์เฉพาะในไลบรารี คุณสามารถลองใช้ od กับทั้งสองไฟล์และค้นหาความแตกต่างระหว่างทั้งสองไฟล์
ColWhi

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