Скомпилированные GCC двоичные файлы дают «не может выполнить двоичный файл» - PullRequest
17 голосов
/ 18 сентября 2010

Я компилирую эту программу:

#include <stdio.h>

int main()
{
    printf("Hello World!");
    return 0;
}

С помощью этой команды:

  gcc -c "hello.c" -o hello

И когда я пытаюсь выполнить привет, я получаю

bash: ./hello: Permission denied

Потому что разрешения

-rw-r--r-- 1 nathan nathan   856 2010-09-17 23:49 hello

Почему-то ??

Но как бы там ни было ... после изменения разрешений и повторной попытки выполнения я получаю

bash: ./hello: cannot execute binary file

Я использую gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3

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

P.S. Я (иногда) работаю над программами более сложными, чем Hello World, но gcc делает это по всем направлениям ...

Ответы [ 3 ]

25 голосов
/ 18 сентября 2010

Возьмите -c. Это для создания объектных файлов, а не исполняемых файлов.

6 голосов
/ 18 сентября 2010

Флаг -c говорит, что он не должен связываться, поэтому у вас есть объектный файл, а не двоичный исполняемый файл.

На самом деле, если вы запустили это без флага -o, вы обнаружите, чтовыходной файл по умолчанию будет hello.o.

. Для справки (и хихиканья) запись man на флаге -c:

-c  Compile or assemble the source files, but do not link.  The linking stage simply is not done.
    The ultimate output is in the form of an object file for each source file.

    By default, the object file name for a source file is made by replacing the suffix .c, .i, .s,
    etc., with .o.

    Unrecognized input files, not requiring compilation or assembly, are ignored.
3 голосов
/ 18 сентября 2010

Компилировать с: gcc hello.c -o hello

...