ฉันกำลังเผชิญกับปัญหาที่กินฟันของฉันไปมาก ฉันกำลังพยายามเชื่อมโยงไฟล์วัตถุของฉัน (โปรแกรมขนาดเล็กที่คอมไพล์ด้วย nasm) กับ ld linker และใช้ฟังก์ชัน c ฉันค้นหามากและฉันพบว่าวิธีการโหลด c libs ทั้งหมดคือการส่ง -lc เป็นตัวเลือกให้กับ ld ซึ่งได้ปิดเสียงคำเตือนและข้อผิดพลาดทั้งหมดโดยสุจริตและสร้างไฟล์ปฏิบัติการของฉัน ปัญหาคือฉันได้รับข้อผิดพลาด "ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว" เสมอเมื่อฉันพยายามเรียกใช้โปรแกรมของฉัน
ฉันค้นหามากทางอินเทอร์เน็ตและฉันพบคำตอบที่เป็นประโยชน์นี้ ถามคำตอบของอูบุนตู แต่น่าเสียดายที่นี่ไม่ได้แก้ปัญหาของฉัน
ข้อมูลบางส่วนที่นี่:
> ไฟล์หลัก
คืน:
หลัก: ปฏิบัติการ LSB 64 บิตของ ELF, x86-64, เวอร์ชัน 1 (SYSV), เชื่อมโยงแบบไดนามิก, ตัวแปล /lib/ld64.so.1, ไม่ถูกถอด
เวอร์ชันของโปรแกรมคือ 64 บิตและล่ามมีอยู่ตาม "คำสั่งไฟล์
> ldd หลัก
คืน:
ลินุกซ์ vdso.so.1 (0x00007ffdf4bcc000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7a10b23000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f7a10f14000)
ตามคำสั่ง "ldd" ไม่มีไลบรารีที่ใช้ร่วมกันที่ขาดหายไป
หมายเหตุ:
โปรแกรมเดียวกันนี้คอมไพล์และเชื่อมโยงสำเร็จด้วย nasm และ ld บน macosx โดยเพิ่มตัวเลือกเหล่านั้น
-macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie
ไปยังตัวเชื่อม ld
แก้ไข 1:
โปรแกรมที่เชื่อมโยงทำงานโดยไม่มีปัญหาใด ๆ เมื่อฉันลบ -lc สำหรับ ld และแน่นอนการเรียกใช้ฟังก์ชัน c ภายในไฟล์ asm ของฉัน
แก้ไข 2:
readelf -h หลัก
คืน:
ส่วนหัวเอลฟ์:
เวทมนตร์: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
คลาส:ELF64
ข้อมูล: 2's ส่วนเติมเต็ม ลิตเติ้ลเอนเดียน
รุ่น: 1 (ปัจจุบัน)
OS/ABI: UNIX - System V
เวอร์ชัน ABI: 0
ประเภท: EXEC (ไฟล์ปฏิบัติการ)
เครื่อง: Advanced Micro Devices X86-64
รุ่น: 0x1
ที่อยู่จุดเริ่มต้น: 0x4005d0
เริ่มต้นส่วนหัวของโปรแกรม: 64 (ไบต์เป็นไฟล์)
จุดเริ่มต้นของส่วนหัว: 19096 (ไบต์ลงในไฟล์)
ค่าสถานะ: 0x0
ขนาดของส่วนหัวนี้: 64 (ไบต์)
ขนาดของส่วนหัวของโปรแกรม: 56 (ไบต์)
จำนวนส่วนหัวของโปรแกรม: 7
ขนาดของส่วนหัว: 64 (ไบต์)
จำนวนส่วนหัวของส่วน: 21
ดัชนีตารางสตริงส่วนหัวของส่วน: 20
ข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับโปรแกรม