Другой нет такого файла или каталога? Но файл существует!

Я столкнулся с проблемой, которая поглотила много моего зубца. Я пытаюсь связать свой объектный файл (небольшую программу, скомпилированную с помощью nasm) с помощью компоновщика ld и используя функции c. Я много искал и обнаружил, что решение для загрузки всех c libs состоит в том, чтобы передать -lc в качестве параметра ld, который честно отключил все предупреждения и ошибки и сгенерировал мой исполняемый файл. Проблема в том, что я всегда получаю сообщение об ошибке «Нет такого файла или каталога», когда пытаюсь запустить свою программу.

Я много искал в Интернете и нашел этот полезный ответ . Спросите ответ Ubuntu , но, к сожалению, это не решило мою проблему.

немного информации здесь:

      > file main

returned:

main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld64.so.1, not stripped

Версия программы 64-битная, а интерпретатор существует согласно "file command.

      > ldd main

returned:

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)

Согласно команде «ldd», отсутствует недостающая общая библиотека.

NB: одна и та же программа скомпилирована и успешно скомпонована с помощью nasm и ld на macosx, добавив эти параметры.

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

к компоновщику ld.

EDIT1: связанная программа работает без проблем, когда я удаляю -lc для ld и, конечно же, вызовы функций c внутри моего файла asm.

РЕДАКТИРОВАТЬ2:

      readelf -h main

returned:

ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x4005d0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          19096 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         7
  Size of section headers:           64 (bytes)
  Number of section headers:         21
  Section header string table index: 20

Некоторая дополнительная информация о программе

1 ответ

Спасибо этому человеку, который поделился своим опытом с другими решениями здесь. благодаря ему я смог решить эту проблему.

Подводя итог, как @steeldriver, возникла проблема с интерпретатором. компоновщик дает моей программе [/lib/ld64.so.1] интерпретатор ELF, но этот путь вообще не существует, и я проверил его:

      > ls /lib/ld64.so.1
ls: cannot access '/lib/ld64.so.1': No such file or directory

После этого я проверил путь интерпретатора в моей установке Ubuntu:

      > 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

Другие вопросы по тегам