-1

Пытаясь запустить объектный файл, который был скомпилирован с помощью gcc, я получил эту ошибку, говоря, что cannot execute binary file: Exec format error . Я не знал, что с этим делать, поэтому я искал в Google.

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

/usr/bin/file -L $(/usr/bin/which ls)

Который получает тот же вывод, что и мой компьютер. Даже идентификатор сборки. Все.

вывод файла

Из того, что я прочитал, это означает, что мы используем одну и ту же программу, я прав? Если так, каковы последствия этого? Значит ли это, что он только что скачал тот же файл .iso что и я? Или что кто-то переписал собственный файл ls и установил его на мой компьютер? Последнее сообщение цепочки было от 13 июля 2016 года, и я думаю, что Ubuntu, должно быть, внес изменения в их iso за это время (я думаю), следовательно, изменив идентификаторы сборки.

Мне нужен кто-то, чтобы сказать мне, что здесь происходит ... Мой компьютер и сеть могут быть скомпрометированы, поэтому, пожалуйста, ничего не выбрасывайте.

1 ответ1

1

Вопрос не включает полное сообщение об ошибке. В частности, он не упоминает, какой файл не может быть выполнен.

Кажется маловероятным, что $(/usr/bin/which ls) является правильным аргументом командной строки для команды file в этой ситуации. Выходные данные команды file гораздо большей вероятностью предоставят соответствующую информацию, если команда вызывается для файла, который не может быть выполнен (тот, чье имя отсутствует в вопросе, поскольку полное сообщение об ошибке отсутствует). Если вы вызовете команду file для соответствующего файла, ее вывод может дать некоторую информацию. Другая информация, которая может иметь отношение к делу, включает в себя, какую версию компилятора вы используете и (возможно, что более важно), как вы ее вызываете.

Один простой способ получить сообщение об ошибке в вашем вопросе - вызвать gcc с -c и попытаться вызвать созданный им объектный файл (что может потребовать добавления разрешения на выполнение для него с помощью chmod). В этом случае вывод команды file может выглядеть примерно так:

test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Если вы связываете этот объектный файл с системными библиотеками с помощью такой команды, как gcc -o test test.o вывод команды file может выглядеть примерно так:

test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=9c069b3da39bd98ef3e72ba070286936c7807ead, not stripped

Короче говоря, двусмысленная формулировка вашего вопроса не исключает возможности того, что вы пытаетесь вызвать перемещаемый объектный файл, а не вызываете исполняемый файл, сгенерированный компоновщиком. Если это не то, что происходит, вам следует отредактировать вопрос, чтобы быть более точным в отношении того, что вы пытаетесь сделать.

Что касается соответствующего BuildID, то да, это означает, что у человека, который задал вопрос на форуме, на который вы ссылались, случается тот же бинарный файл ls что и у вас, но это совершенно не связано с проблемой с ошибкой формата Exec для несвязанного файла, например тот, который вы скомпилировали с GCC.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .