Score:0

ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวอีกหรือ แต่มีไฟล์อยู่!

ธง yt

ฉันกำลังเผชิญกับปัญหาที่กินฟันของฉันไปมาก ฉันกำลังพยายามเชื่อมโยงไฟล์วัตถุของฉัน (โปรแกรมขนาดเล็กที่คอมไพล์ด้วย 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

ข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับโปรแกรม

Terrance avatar
id flag
คุณใช้ Ubuntu เวอร์ชันใด
Mohamed Elleuch avatar
yt flag
ฉันใช้ Ubuntu 18.04.6 LTS
Terrance avatar
id flag
สิ่งนี้ฟังดูเหมาะสมกว่าสำหรับ https://stackoverflow.com/ เป็นคำถามเกี่ยวกับการเขียนโปรแกรมและไม่มากเท่ากับปัญหาของ Ubuntu
Mohamed Elleuch avatar
yt flag
ฉันไม่ได้รับข้อผิดพลาดหรือคำเตือนใด ๆ เมื่อฉันรวบรวมและเชื่อมโยงอาจโปรแกรม ข้อผิดพลาดเดียวที่ฉันได้รับคือเมื่อฉันพยายามเรียกใช้ไฟล์ที่สร้างโดย: ./หลัก และทุบตีพูดว่า: bash: ./main: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
Terrance avatar
id flag
คุณทำให้มันเรียกใช้งานได้โดย `chmod +x main` หรือไม่
Mohamed Elleuch avatar
yt flag
ใช่ ฉันลองแล้วไม่สำเร็จ ในกรณีปกติ ld จะสร้างไฟล์ที่มี x flag ใช้งานอยู่ แต่สิ่งนี้ฉันลองแล้ว
Mohamed Elleuch avatar
yt flag
ฉันพยายามเปิดโปรแกรมที่สร้างขึ้น (หลัก) โดยตัวแก้ไข HEX และฉันพบว่ามันดูปกติมากเช่นไฟล์เรียกทำงานอื่นๆ
Mohamed Elleuch avatar
yt flag
ขอบคุณสำหรับความช่วยเหลือของคุณ @Terrance แต่ปัญหาไม่ได้อยู่ที่รหัสของฉันเพราะฉันแค่พยายามแสดง "hello world" ไปยัง STDOUT จากแอสเซมเบลอร์โดยเรียกฟังก์ชัน printf ( c )
hr flag
`interpreter /lib/ld64.so.1` ดูน่าสงสัย - มีล่ามนี้หรือไม่
Terrance avatar
id flag
จากนั้นโปรด[แก้ไข](https://askubuntu.com/posts/1388695/edit)คำถามของคุณ และเพิ่มรายละเอียดเกี่ยวกับปัญหาที่คุณได้รับ โค้ด ทุกอย่างที่คุณได้ลอง ยิ่งคุณให้รายละเอียดมากเท่าไหร่ เรายิ่งช่วยคุณได้มากเท่านั้น!
Mohamed Elleuch avatar
yt flag
@steeldriver จริงๆ แล้วทั้งหมดที่ฉันรู้จากประสบการณ์เก่าๆ คือ "interpreter /lib/ld64.so.3" คุณแนะนำวิธีแก้ปัญหาให้ลองหรือไม่?
hr flag
ไม่เป็นไร - ฉันเห็นจากผลลัพธ์ ldd ของคุณว่ามันแก้ไขเป็น `/lib64/ld-linux-x86-64.so.2`
Mohamed Elleuch avatar
yt flag
@steeldriver จริง ๆ แล้วข้อสงสัยของคุณเกี่ยวกับล่ามนั้นถูกต้อง ฉันแก้ไขมัน มันเป็นปัญหาของล่าม ขอบคุณมากสำหรับทุกคนที่พยายามแก้ปัญหา
Score:2
ธง yt

ขอบคุณชายคนนี้ที่แบ่งปันประสบการณ์ของเขากับผู้อื่น วิธีแก้ไขที่นี่. ขอบคุณเขาฉันสามารถแก้ปัญหานี้ได้

เพื่อสรุป เนื่องจาก @steeldriver มีปัญหาล่าม ตัวเชื่อมโยงกำลังให้โปรแกรมของฉัน [/lib/ld64.so.1] เป็นล่าม ELF แต่ไม่มีเส้นทางนี้เลยและฉันตรวจสอบโดย:

> ls /lib/ld64.so.1
ls: ไม่สามารถเข้าถึง '/lib/ld64.so.1': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

หลังจากนั้น ฉันตรวจสอบเส้นทางล่ามในการติดตั้งอูบุนตูของฉันโดย:

> ls /lib64/ld-*
/lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3

ดังนั้นวิธีแก้ปัญหาคือสร้างลิงค์ของหนึ่งในล่ามนี้ไปยังเส้นทางล่ามที่ไม่มีอยู่โดย:

sudo ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld64.so.1

ตอนนี้เราตรวจสอบล่ามที่ไม่มีอยู่อีกครั้งเพื่อดูว่ามันยังคงอยู่หรือไม่:

> ls /lib/ld64.so.1
/lib/ld64.so.1

ตอนนี้คำสั่งนี้ได้ส่งคืน /lib/ld64.so.1 แทน "ไฟล์ที่ไม่มีอยู่" ดังนั้นปัญหาจึงได้รับการแก้ไข และฉันสามารถเรียกใช้ ./main ได้สำเร็จ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา