Автоматически сгенерированный ассемблерный код для "Hello World!"не основывается на Netbeans 8.1 на Windows 10 - PullRequest
0 голосов
/ 22 мая 2018

Я не могу собрать и запустить код сборки на Netbeans 8.1.Тем не менее, я могу правильно построить и запустить мой код C.

Подробности моих инструментов на основе C следующие:

enter image description here

Сначала я выбрал разработку приложения на C:

enter image description here

Я создал проект под названием Assembly:

enter image description here

Я пытался повторить шаги, указанные в Дариус '.У меня был main.c файл, в котором я набрал printf("Hello World\n");, и он работал.

enter image description here

Затем я создал main.s, набрав gcc -S main.cв командной строке Windows и main.s был создан.Я попытался построить его, но он не получился со следующим выводом:

cd 'C:\Users\XXXX\Documents\NetBeansProjects\AssemblyProject\Assembly_test'
C:\cygwin64\bin\make.exe -f Makefile CONF=Debug clean
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
make[1]: Entering directory '/cygdrive/c/Users/XXXX/Documents/NetBeansProjects/AssemblyProject/Assembly_test'
rm -f -r build/Debug
rm -f dist/Debug/Cygwin-Windows/assembly_test.exe
make[1]: Leaving directory '/cygdrive/c/Users/XXXX /Documents/NetBeansProjects/AssemblyProject/Assembly_test'

CLEAN SUCCESSFUL (total time: 533ms)
cd 'C:\Users\XXXX\Documents\NetBeansProjects\AssemblyProject\Assembly_test'
C:\cygwin64\bin\make.exe -f Makefile CONF=Debug
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory '/cygdrive/c/Users/XXXX/Documents/NetBeansProjects/AssemblyProject/Assembly_test'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin-Windows/assembly_test.exe
make[2]: Entering directory '/cygdrive/c/Users/XXXX/Documents/NetBeansProjects/AssemblyProject/Assembly_test'
mkdir -p build/Debug/Cygwin-Windows
as  -g -o build/Debug/Cygwin-Windows/main.o main.s
mkdir -p dist/Debug/Cygwin-Windows
gcc     -o dist/Debug/Cygwin-Windows/assembly_test build/Debug/Cygwin-Windows/main.o 
build/Debug/Cygwin-Windows/main.o:main.s:21:(.stab+0x14): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:23:(.stab+0x20): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x2c): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x38): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x44): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x50): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x5c): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x68): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x74): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x80): relocation truncated to fit: R_X86_64_32 against `.text'
build/Debug/Cygwin-Windows/main.o:main.s:26:(.stab+0x8c): additional relocation overflows omitted from the output
collect2: error: ld returned 1 exit status
make[2]: *** [nbproject/Makefile-Debug.mk:63: dist/Debug/Cygwin-Windows/assembly_test.exe] Error 1
make[2]: Leaving directory '/cygdrive/c/Users/XXXX
/Documents/NetBeansProjects/AssemblyProject/Assembly_test'
make[1]: *** [nbproject/Makefile-Debug.mk:59: .build-conf] Error 2
make[1]: Leaving directory '/cygdrive/c/Users/XXXX/Documents/NetBeansProjects/AssemblyProject/Assembly_test'
make: *** [nbproject/Makefile-impl.mk:40: .build-impl] Error 2

BUILD FAILED (exit value 2, total time: 1s)

enter image description here

enter image description here

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

Подробности моего ассемблера следующие:

C:\Users\XXXXX>as --version

GNU assembler (GNU Binutils) 2.29.1.20171006 
Copyright (C) 2017 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or later. 
This program has absolutely no warranty. 
This assembler was configured for a target of `x86_64-pc-cygwin'.

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

После открытия командной строки Cygwin и запуска команд для компиляции и запускапрограммы, я заметил, что я могу запустить как свою сборку, так и коды C.

enter image description here

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

Я создал новый проект,использовал gcc -S main.c для создания файла main.s, и он не смог собрать на Netbeans (Сбой с теми же ошибками об усечении). Я нахожу еще более странным, что я могу использовать команду gcc main.s -o MAIN в командной строке Windows и создать исполняемый файл (MAIN.exe), который отлично работает (из командной строки) .Итак, это показывает, что мой автоматически сгенерированный ассемблерный код не может быть собран ТОЛЬКО в моей среде Netbeans.

Может кто-нибудь объяснить, пожалуйста, причину такого поведения?

Кроме того, Рамхунд указалчто мой make-файл не указывает на правильное местоположение.Как показано на первом рисунке этого вопроса, я выбираю опцию проекта, которая автоматически создает свой собственный make-файл.Более того, make-файл позволяет моему коду на C прекрасно работать и работать.Проблема возникает только тогда, когда я пытаюсь собрать свои программы сборки на Netbeans. Я просмотрел ссылку Дариуса, и ничего не было сказано об изменении make-файла JUST для программ сборки.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

На скриншоте части main.s не показано использование 32-битной абсолютной адресации.Ваше сообщение об ошибке включает в себя main.s:21:(.stab+0x14): relocation truncated to fit: R_X86_64_32 against .text'`, но инструкция в строке 21 является LEA-относительной LEA, поэтому она должна использовать перемещение x86_64_PC32.

Ваш gcc создавал независимый от позиции код.

Но в ошибке упоминается .stab, поэтому, возможно, проблема в устаревшем формате отладки, использующем 32-битные абсолютные адреса.Возможно, у вас установлен Netbeans для компиляции / сборки с -gstabs или чем-то еще.Для целей ELF форматом по умолчанию -g является DWARF, но IDK для Windows.

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

0 голосов
/ 22 мая 2018

Сборка, которую вы пытаетесь запустить, использует системные вызовы Linux и не может быть запущена в системе Windows.

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

...