bash: ./main.o не может выполнить двоичный файл Exe c Ошибка формата - PullRequest
1 голос
/ 23 января 2020

Я настроил виртуальную машину с Ubuntu на windows с использованием виртуальной коробки.

Я пытаюсь запустить проект C ++. Файл make выглядит следующим образом

CC = g++ -O2 -Wno-deprecated 

tag = -i

ifdef linux
tag = -n
endif

test.out: Record.o Comparison.o ComparisonEngine.o Schema.o File.o DBFile.o y.tab.o lex.yy.o test.o
    $(CC) -o test.out Record.o Comparison.o ComparisonEngine.o Schema.o File.o DBFile.o y.tab.o lex.yy.o test.o -lfl

main: Record.o Comparison.o ComparisonEngine.o Schema.o File.o y.tab.o lex.yy.o main.o
    $(CC) -o main Record.o Comparison.o ComparisonEngine.o Schema.o File.o y.tab.o lex.yy.o main.o -lfl

test.o: test.cc
    $(CC) -g -c test.cc

main.o: main.cc
    $(CC) -g -c main.cc

Comparison.o: Comparison.cc
    $(CC) -g -c Comparison.cc

ComparisonEngine.o: ComparisonEngine.cc
    $(CC) -g -c ComparisonEngine.cc

DBFile.o: DBFile.cc
    $(CC) -g -c DBFile.cc

File.o: File.cc
    $(CC) -g -c File.cc

Record.o: Record.cc
    $(CC) -g -c Record.cc

Schema.o: Schema.cc
    $(CC) -g -c Schema.cc

y.tab.o: Parser.y
    yacc -d Parser.y
    sed $(tag) y.tab.c -e "s/  __attribute__ ((__unused__))$$/# ifndef __cplusplus\n  __attribute__ ((__unused__));\n# endif/" 
    g++ -c y.tab.c

lex.yy.o: Lexer.l
    lex  Lexer.l
    gcc  -c lex.yy.c

clean: 
    rm -f *.o
    rm -f *.out
    rm -f y.tab.c
    rm -f lex.yy.c
    rm -f y.tab.h

После запуска команды make я получаю кучу предупреждений, таких как

g++ -O2 -Wno-deprecated  -g -c Record.cc
g++ -O2 -Wno-deprecated  -g -c Comparison.cc
g++ -O2 -Wno-deprecated  -g -c ComparisonEngine.cc
g++ -O2 -Wno-deprecated  -g -c Schema.cc
Schema.cc: In constructor ‘Schema::Schema(const char*, const char*)’:
Schema.cc:46:9: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  fscanf (foo, "%s", space);
  ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:58:10: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   fscanf (foo, "%s", space);
   ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:84:9: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  fscanf (foo, "%s", space);
  ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:91:10: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   fscanf (foo, "%s", space);
   ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:95:11: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    fscanf (foo, "%s", space);
    ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:106:10: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   fscanf (foo, "%s", space);
   ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:114:10: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   fscanf (foo, "%s", space);
   ~~~~~~~^~~~~~~~~~~~~~~~~~
Schema.cc:118:10: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   fscanf (foo, "%s", space);
   ~~~~~~~^~~~~~~~~~~~~~~~~~
g++ -O2 -Wno-deprecated  -g -c File.cc
File.cc: In member function ‘void File::GetPage(Page*, off_t)’:
File.cc:186:7: warning: ignoring return value of ‘ssize_t read(int, void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
  read (myFilDes, bits, PAGE_SIZE);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
File.cc: In member function ‘void File::AddPage(Page*, off_t)’:
File.cc:206:10: warning: ignoring return value of ‘ssize_t write(int, const void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
    write (myFilDes, &foo, sizeof (int));
    ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
File.cc:223:8: warning: ignoring return value of ‘ssize_t write(int, const void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
  write (myFilDes, bits, PAGE_SIZE);
  ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
File.cc: In member function ‘void File::Open(int, char*)’:
File.cc:258:8: warning: ignoring return value of ‘ssize_t read(int, void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
   read (myFilDes, &curLength, sizeof (off_t));
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
File.cc: In member function ‘int File::Close()’:
File.cc:276:8: warning: ignoring return value of ‘ssize_t write(int, const void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
  write (myFilDes, &curLength, sizeof (off_t));
  ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
g++ -O2 -Wno-deprecated  -g -c DBFile.cc
yacc -d Parser.y
sed -i y.tab.c -e "s/  __attribute__ ((__unused__))$/# ifndef __cplusplus\n  __attribute__ ((__unused__));\n# endif/" 
g++ -c y.tab.c
y.tab.c: In function ‘int yyparse()’:
y.tab.c:1427:35: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       yyerror (YY_("syntax error"));
                                   ^
y.tab.c:1571:35: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   yyerror (YY_("memory exhausted"));
                                   ^
lex  Lexer.l
gcc  -c lex.yy.c
g++ -O2 -Wno-deprecated  -g -c test.cc
g++ -O2 -Wno-deprecated  -o test.out Record.o Comparison.o ComparisonEngine.o Schema.o File.o DBFile.o y.tab.o lex.yy.o test.o -lfl

Все файлы компилируются, генерируя соответствующие .o файлы, кроме main.cc , Поэтому я скомпилировал его с помощью этой команды

g++ -O2 -Wno-deprecated -g -c -o main.o main.cc

Теперь файл main.o компилируется и генерируется main.o

Затем я запускаю его с помощью ./main.o и получаю Разрешение отклонено

Итак, я избавился от этой ошибки с помощью chmod 755 ./* Теперь запуск main.o дает эту ошибку

bash: ./main.o cannot execute binary file Exec format error

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

file main.o выходы x86-64 и uname -m выходы x86_64

Я не могу понять проблема. Любая помощь будет принята с благодарностью! Спасибо!

1 Ответ

2 голосов
/ 23 января 2020

Вы пытаетесь выполнить объектный файл. Объектные файлы, такие как main.o, не являются исполняемыми. Они содержат только часть кода, необходимую для формирования выполнимого.

Вам нужно запустить main (или, может быть, test.out), который является фактическим исполняемым файлом.

Предупреждения о разрешении были говорит вам то же самое (что main.o не является исполняемым), но вы перезаписали это с chmod.

main должно быть создано make при условии, что нет ошибок компиляции / компоновки, если вы используйте make main или test.out, если вы используете make или make test.out. Вызов компоновщика дается в цели main: / test.out: файла Makefile. Если make генерирует ошибки компилятора или компоновщика, то повторение тех же команд вручную не исправит это. Вместо этого исправьте код или Makefile.

Также обратите внимание, что предупреждения / ошибки существуют по причине. Начиная с C ++ 11, вам не разрешено приводить строковые литералы к char*, только к const char*. Это устарело уже в C ++ 03. Обход этого правила только создаст вам проблемы в будущем. Исправьте ваш код вместо добавления -Wno-deprecated.

...