Điểm:0

Khác không có tập tin hoặc thư mục như vậy? Nhưng tập tin tồn tại!

lá cờ yt

tôi đang đối mặt với một vấn đề tiêu tốn rất nhiều thời gian của tôi. tôi đang cố gắng liên kết tệp đối tượng của mình (chương trình nhỏ được biên dịch bằng nasm) với trình liên kết ld và sử dụng các hàm c. Tôi đã tìm kiếm rất nhiều và tôi thấy rằng giải pháp để tải tất cả các thư viện c là chuyển -lc làm tùy chọn cho ld, tùy chọn này đã tắt tiếng tất cả các cảnh báo và lỗi một cách trung thực và tạo ra tệp thực thi của tôi. Vấn đề là tôi luôn gặp lỗi "Không có tệp hoặc thư mục như vậy" khi tôi cố chạy chương trình của mình.

Tôi đã tìm kiếm rất nhiều trên internet và tôi tìm thấy câu trả lời hữu ích này Hỏi Ubuntu Trả lời nhưng tiếc là điều này không giải quyết được vấn đề của tôi.

một số thông tin ở đây:

> tập tin chính

trả lại:

chính: ELF 64-bit LSB có thể thực thi được, x86-64, phiên bản 1 (SYSV), được liên kết động, trình thông dịch /lib/ld64.so.1, không bị tước bỏ

Phiên bản chương trình là 64 bit và trình thông dịch tồn tại theo "file command.

> ldd chính

trả lại:

linux-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)

Theo lệnh "ldd", không có thư viện dùng chung nào bị thiếu

NB: Chương trình tương tự được biên dịch và liên kết thành công với nasm và ld trên macosx bằng cách thêm các tùy chọn đó

-macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie

đến trình liên kết ld.

CHỈNH SỬA1: Chương trình được liên kết hoạt động mà không có bất kỳ sự cố nào khi tôi xóa -lc cho ld và tất nhiên các lệnh gọi hàm c bên trong tệp asm của tôi

CHỈNH SỬA2:

readelf -h chính

trả lại:

Tiêu đề ELF:
  Phép thuật: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Lớp: ELF64
  Dữ liệu: phần bù 2, endian nhỏ
  Phiên bản: 1 (hiện tại)
  HĐH/ABI: UNIX - Hệ thống V
  Phiên bản ABI: 0
  Loại: EXEC (Tệp thực thi)
  Máy: Advanced Micro Devices X86-64
  Phiên bản: 0x1
  Địa chỉ điểm vào: 0x4005d0
  Bắt đầu tiêu đề chương trình: 64 (byte vào tệp)
  Bắt đầu tiêu đề phần: 19096 (byte vào tệp)
  Cờ: 0x0
  Kích thước của tiêu đề này: 64 (byte)
  Kích thước của tiêu đề chương trình: 56 (byte)
  Số lượng tiêu đề chương trình: 7
  Kích thước của tiêu đề phần: 64 (byte)
  Số lượng tiêu đề phần: 21
  Chỉ mục bảng chuỗi tiêu đề phần: 20

Một số thông tin thêm về chương trình

Terrance avatar
lá cờ id
Bạn đang sử dụng phiên bản Ubuntu nào?
Mohamed Elleuch avatar
lá cờ yt
tôi đang sử dụng Ubuntu 18.04.6 LTS
Terrance avatar
lá cờ id
Điều này nghe có vẻ phù hợp hơn với https://stackoverflow.com/ như một câu hỏi lập trình và không nhiều như một vấn đề về Ubuntu.
Mohamed Elleuch avatar
lá cờ yt
tôi không nhận được bất kỳ lỗi hoặc cảnh báo nào khi tôi biên dịch và liên kết chương trình. lỗi duy nhất mà tôi gặp phải là khi tôi cố chạy tệp đã tạo bằng cách: ./chủ yếu và bash nói: bash: ./main: Không có tệp hoặc thư mục như vậy
Terrance avatar
lá cờ id
Bạn có làm cho nó có thể thực thi được bằng `chmod +x main` không?
Mohamed Elleuch avatar
lá cờ yt
vâng tôi đã thử nó mà không thành công đã là ld trong các trường hợp bình thường tạo các tệp có cờ x hoạt động nhưng tôi đã thử nó.
Mohamed Elleuch avatar
lá cờ yt
tôi cũng đã cố mở chương trình đã tạo (chính) bằng trình chỉnh sửa HEX. và tôi thấy rằng nó trông rất bình thường chẳng hạn như bất kỳ tệp thực thi nào khác
Mohamed Elleuch avatar
lá cờ yt
cảm ơn sự giúp đỡ của bạn @Terrance, nhưng vấn đề không nằm ở mã của tôi vì tôi chỉ đang cố gắng hiển thị "hello world" cho STDOUT từ trình biên dịch chương trình hợp ngữ bằng cách gọi hàm printf ( c ).
lá cờ hr
`interpreter /lib/ld64.so.1` có vẻ đáng ngờ - trình thông dịch này có tồn tại không?
Terrance avatar
lá cờ id
Sau đó, vui lòng [chỉnh sửa](https://askubuntu.com/posts/1388695/edit) câu hỏi của bạn và thêm càng nhiều chi tiết về vấn đề bạn đang gặp phải, mã, mọi thứ bạn đã thử. Bạn cung cấp cho chúng tôi càng nhiều chi tiết thì chúng tôi càng có thể giúp bạn tốt hơn!
Mohamed Elleuch avatar
lá cờ yt
@steeldriver thành thật mà nói, tất cả những gì tôi biết từ kinh nghiệm cũ của mình là "interpreter /lib/ld64.so.3" bạn có đề xuất giải pháp anu để thử không ??
lá cờ hr
Đừng bận tâm - Tôi thấy từ đầu ra ldd của bạn rằng nó phân giải thành `/lib64/ld-linux-x86-64.so.2`
Mohamed Elleuch avatar
lá cờ yt
@steeldriver thực sự nghi ngờ của bạn về trình thông dịch là chính xác. tôi đã giải quyết nó. đó là một vấn đề thông dịch viên. thnx rất nhiều cho tất cả những ai đã cố gắng đưa ra giải pháp
Điểm:2
lá cờ yt

Cảm ơn người đàn ông này đã chia sẻ kinh nghiệm của mình với những người khác giải pháp ở đây. nhờ anh ấy tôi đã có thể giải quyết vấn đề này.

Tóm lại, với tư cách là @steeldriver, đã xảy ra sự cố về trình thông dịch. trình liên kết đang cung cấp cho chương trình của tôi [/lib/ld64.so.1] với tư cách là trình thông dịch ELF nhưng đường dẫn này hoàn toàn không tồn tại và tôi đã kiểm tra nó bằng cách:

> ls /lib/ld64.so.1
ls: không thể truy cập '/lib/ld64.so.1': Không có tệp hoặc thư mục như vậy

Sau đó, tôi đã kiểm tra đường dẫn của trình thông dịch trên bản cài đặt Ubuntu của mình bằng cách:

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

vì vậy giải pháp là tạo liên kết của một trong các trình thông dịch này với đường dẫn trình thông dịch không tồn tại bằng cách:

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

Bây giờ chúng ta kiểm tra lại trình thông dịch không tồn tại một lần nữa để xem liệu nó có còn tồn tại hay không:

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

Bây giờ lệnh này đã trả về /lib/ld64.so.1 thay vì "tệp không tồn tại". vì vậy sự cố đã được giải quyết và tôi có thể chạy ./main thành công

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.