Рейтинг:0

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

флаг yt

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

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

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

> основной файл

вернулся:

main: 64-битный исполняемый файл ELF LSB, x86-64, версия 1 (SYSV), динамическая компоновка, интерпретатор /lib/ld64.so.1, не разделенный

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

> лдд главный

вернулся:

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», отсутствует недостающая общая библиотека.

Примечание: Та же программа скомпилирована и успешно скомпонована с помощью 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 
  Класс: ЭЛЬФ64
  Данные: дополнение до 2, обратный порядок байтов
  Версия: 1 (текущая)
  ОС/ABI: UNIX - System V
  Версия АБИ: 0
  Тип: EXEC (исполняемый файл)
  Машина: Advanced Micro Devices X86-64
  Версия: 0x1
  Адрес точки входа: 0x4005d0
  Начало заголовков программы: 64 (байт в файле)
  Начало заголовков разделов: 19096 (байт в файле)
  Флаги: 0x0
  Размер этого заголовка: 64 (байта)
  Размер заголовков программы: 56 (байт)
  Количество заголовков программ: 7
  Размер заголовков разделов: 64 (байта)
  Количество заголовков разделов: 21
  Индекс таблицы строк заголовка раздела: 20

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

Terrance avatar
флаг id
Какую версию Ubuntu вы используете?
Mohamed Elleuch avatar
флаг yt
я использую Ubuntu 18.04.6 LTS
Terrance avatar
флаг id
Это больше подходит для https://stackoverflow.com/ как вопрос программирования, а не как проблема Ubuntu.
Mohamed Elleuch avatar
флаг yt
я не получил никаких ошибок или предупреждений, когда я компилирую и связываю программу. единственная ошибка, которую я получаю, это когда я пытаюсь запустить сгенерированный файл: ./главный и баш говорит: bash: ./main: нет такого файла или каталога
Terrance avatar
флаг id
Вы сделали его исполняемым с помощью `chmod +x main`?
Mohamed Elleuch avatar
флаг yt
да пробовал безрезультатно уже ld в обычных случаях генерирует файлы с активным флагом x, но, несмотря на это, я пробовал.
Mohamed Elleuch avatar
флаг yt
также я попытался открыть сгенерированную программу (основную) с помощью HEX-редактора. и я обнаружил, что он выглядит очень нормально, как и любой другой исполняемый файл
Mohamed Elleuch avatar
флаг yt
спасибо за вашу помощь @Terrance, но проблема не в моем коде, потому что я просто пытаюсь показать «hello world» в STDOUT из ассемблера, вызвав printf (функция c).
флаг hr
`interpreter /lib/ld64.so.1` выглядит подозрительно – существует ли этот интерпретатор?
Terrance avatar
флаг id
Затем, пожалуйста, [отредактируйте] (https://askubuntu.com/posts/1388695/edit) свой вопрос и добавьте как можно больше подробностей о проблеме, которую вы получаете, коде, обо всем, что вы пробовали. Чем больше деталей вы сообщите нам, тем лучше мы сможем вам помочь!
Mohamed Elleuch avatar
флаг yt
@steeldriver, честно говоря, все, что я знаю из своего старого опыта, это «интерпретатор /lib/ld64.so.3» вы предлагаете ану решение попробовать ??
флаг hr
Неважно - я вижу из вашего вывода ldd, что он разрешается в `/lib64/ld-linux-x86-64.so.2`
Mohamed Elleuch avatar
флаг yt
@steeldriver на самом деле ваши сомнения по поводу переводчика были правильными. я решил это. это была проблема переводчика. Большое спасибо всем, кто пытался дать решение
Рейтинг:2
флаг yt

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

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

> лс /lib/ld64.so.1
ls: невозможно получить доступ к '/lib/ld64.so.1': нет такого файла или каталога

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

> лс /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

Теперь мы еще раз перепроверяем несуществующий интерпретатор, чтобы убедиться, что он еще не существует:

> лс /lib/ld64.so.1
/lib/ld64.so.1

Теперь эта команда вернула /lib/ld64.so.1 вместо «несуществующий файл». так что проблема была решена, и я мог успешно запустить ./main

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.