Puncte:0

Încă un astfel de fișier sau director? Dar dosarul există!

drapel yt

Mă confrunt cu o problemă care mi-a consumat mult din tine. Încerc să conectez fișierul meu obiect (program mic compilat cu nasm) cu ld linker și folosind funcții c. Am căutat mult și am găsit că soluția pentru a încărca toate bibliotecile c este să treci -lc ca opțiune la ld, care a dezactivat sincer toate avertismentele și erorile și a generat executabilul meu. Problema este că primesc întotdeauna eroarea „Fără un astfel de fișier sau director” atunci când încerc să rulez programul.

Am căutat mult pe internet și am găsit acest răspuns util Întrebați răspunsul Ubuntu dar din pacate asta nu mi-a rezolvat problema.

cateva informatii aici:

> fișierul principal

întors:

principal: executabil LSB ELF pe 64 de biți, x86-64, versiunea 1 (SYSV), legat dinamic, interpret /lib/ld64.so.1, nedemontat

Versiunea programului este pe 64 de biți și interpretul există conform „comanda fișierului.

> ldd principal

întors:

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)

Conform comenzii „ldd”, nu lipsește nicio bibliotecă partajată

N.B: Același program a fost compilat și legat cu succes cu nasm și ld pe macosx prin adăugarea acelor opțiuni

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

la linker-ul ld.

EDIT1: Programul legat funcționează fără nicio problemă când elimin -lc pentru ld și, desigur, apelurile funcțiilor c din fișierul meu asm

EDIT2:

readelf -h principal

întors:

Antet ELF:
  Magie: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Clasa: ELF64
  Date: complementul 2, little endian
  Versiune: 1 (actuală)
  OS/ABI: UNIX - System V
  Versiunea ABI: 0
  Tip: EXEC (fișier executabil)
  Mașină: Advanced Micro Devices X86-64
  Versiune: 0x1
  Adresa punctului de intrare: 0x4005d0
  Începutul antetelor programului: 64 (octeți în fișier)
  Începutul antetelor secțiunii: 19096 (octeți în fișier)
  Steaguri: 0x0
  Dimensiunea acestui antet: 64 (octeți)
  Dimensiunea antetelor programului: 56 (octeți)
  Numărul antetelor programului: 7
  Dimensiunea antetelor secțiunii: 64 (octeți)
  Număr de anteturi de secțiune: 21
  Indexul tabelului șirurilor din antetul secțiunii: 20

Câteva informații suplimentare despre program

Terrance avatar
drapel id
Ce versiune de Ubuntu folosești?
Mohamed Elleuch avatar
drapel yt
Eu folosesc Ubuntu 18.04.6 LTS
Terrance avatar
drapel id
Acest lucru sună mai potrivit pentru https://stackoverflow.com/ ca o întrebare de programare și nu la fel de mult ca o problemă Ubuntu.
Mohamed Elleuch avatar
drapel yt
Nu am primit nicio eroare sau avertisment când am compilat și linkul poate programa. singura eroare pe care o primesc este atunci când încerc să rulez fișierul generat prin: ./principal iar bash spune: bash: ./main: Nu există un astfel de fișier sau director
Terrance avatar
drapel id
L-ați făcut executabil prin `chmod +x main`?
Mohamed Elleuch avatar
drapel yt
da am incercat fara succes deja ld în cazuri normale generează fișiere cu x flag activ, dar deși am încercat asta.
Mohamed Elleuch avatar
drapel yt
de asemenea, am încercat să deschid programul generat (principal) de un editor HEX. și am descoperit că arată foarte normal, ca orice alt executabil
Mohamed Elleuch avatar
drapel yt
Vă mulțumesc pentru ajutor @Terrance, dar problema nu este legată de codul meu, deoarece doar încerc să arăt „bună lume” la STDOUT de la asamblator apelând printf (funcția c).
drapel hr
`interpretul /lib/ld64.so.1` pare suspect - există acest interpret?
Terrance avatar
drapel id
Apoi, vă rugăm să [editați](https://askubuntu.com/posts/1388695/edit) întrebarea dvs. și adăugați cât mai multe detalii despre problema pe care o primiți, cod, tot ce ați încercat. Cu cât ne oferi mai multe detalii, cu atât te putem ajuta mai bine!
Mohamed Elleuch avatar
drapel yt
@steeldriver sincer tot ce știu din vechile mele experiențe este „interpretul /lib/ld64.so.3” imi sugerezi o solutie de incercat??
drapel hr
Nu contează - văd din rezultatul ldd că se rezolvă la `/lib64/ld-linux-x86-64.so.2`
Mohamed Elleuch avatar
drapel yt
@steeldriver de fapt, îndoiala ta cu privire la interpret a fost corectă. am rezolvat-o. a fost o problemă de interpret. thnx mult pentru toți cei care au încercat să dea o soluție
Puncte:2
drapel yt

Mulțumesc acestui om care și-a împărtășit experiența cu alții solutie aici. datorită lui am reușit să rezolv această problemă.

Pentru a rezuma, ca @steeldriver totuși, a existat o problemă de interpret. linkerul dă programului meu [/lib/ld64.so.1] ca interpret ELF, dar această cale nu există deloc și am verificat-o prin:

> ls /lib/ld64.so.1
ls: nu poate accesa „/lib/ld64.so.1”: Nu există un astfel de fișier sau director

După aceea, am verificat calea interpreților pe instalarea mea ubuntu prin:

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

deci soluția este să creați o legătură a unuia dintre acești interpreți către calea inexistentă a interpretului prin:

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

Acum verificăm din nou interpretul inexistent încă o dată pentru a vedea dacă încă nu există sau nu:

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

Acum această comandă a returnat /lib/ld64.so.1 în loc de „fișier inexistent”. deci problema a fost rezolvată și am putut rula ./main cu succes

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.