为 "Hello World!" 自动生成的汇编代码不在 Windows 10 上的 Netbeans 8.1 上构建
Automatically generated assembly code for "Hello World!" does not build on Netbeans 8.1 on Windows 10
我无法在 Netbeans 8.1 上构建和 运行 汇编代码。然而,我能够正确构建和 运行 我的 C 代码。
我的基于C的工具详情如下:
我首先选择开发C应用程序:
我创建了一个名为 Assembly
的项目:
我试图复制 Darius' link 中给出的步骤。我有一个 main.c
文件,我在其中输入 printf("Hello World\n");
并且它起作用了。
然后我通过在 Windows 命令提示符中键入 gcc -S main.c
创建了 main.s
,并创建了 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)
编辑:
我的汇编器详情如下:
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 代码。
编辑:
我创建了一个新项目,使用 gcc -S main.c
创建了文件 main.s
,但它未能在 Netbeans 上构建(它失败并出现了关于 t运行cation 的相同错误)。 我发现更令人困惑的是我可以在 Windows 命令提示符下使用命令 gcc main.s -o MAIN
并创建一个完美运行的可执行文件 (MAIN.exe)(从命令行)。
所以这表明我自动生成的汇编代码无法仅在我的 Netbeans 环境中构建。
有人可以解释这种行为的原因吗?
此外,Ramhound 指出我的 makefile 没有指向正确的位置。如这个问题的第一张图片所示,我选择了自动创建自己的 makefile 的项目选项。此外,makefile 允许我的 C 代码完美构建和 运行。只有当我尝试在 Netbeans 上构建我的汇编程序时才会出现问题。 我查看了 Darius 的 link 并没有提到仅针对汇编程序修改 makefile。
您尝试 运行 的程序集使用 Linux 系统调用,不能在 Windows 系统上 运行。
Windows没有稳定的系统调用接口,不建议用纯汇编编程。
部分main.s
的截图没有显示任何32位绝对寻址的使用。您的错误消息包括 main.s:21:(.stab+0x14): relocation truncated to fit: R_X86_64_32 against
.text'`,但第 21 行的指令是 RIP 相关的 LEA,因此它应该使用 x86_64_PC32 重定位。
您的 gcc 正在生成与位置无关的代码。
但错误提到 .stab
,所以问题可能是使用 32 位绝对地址的过时调试格式。也许您将 Netbeans 设置为 compile/assemble 和 -gstabs
之类的。在 ELF 目标上,-g
的默认格式是 DWARF,但 IDK 关于 Windows。
无论如何,通过关闭 Netbeans 中的调试符号来测试这个理论,看看错误是否消失。如果是这样,您就知道生成调试信息是问题所在。
我无法在 Netbeans 8.1 上构建和 运行 汇编代码。然而,我能够正确构建和 运行 我的 C 代码。
我的基于C的工具详情如下:
我首先选择开发C应用程序:
我创建了一个名为 Assembly
的项目:
我试图复制 Darius' link 中给出的步骤。我有一个 main.c
文件,我在其中输入 printf("Hello World\n");
并且它起作用了。
然后我通过在 Windows 命令提示符中键入 gcc -S main.c
创建了 main.s
,并创建了 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)
编辑:
我的汇编器详情如下:
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 代码。
编辑:
我创建了一个新项目,使用 gcc -S main.c
创建了文件 main.s
,但它未能在 Netbeans 上构建(它失败并出现了关于 t运行cation 的相同错误)。 我发现更令人困惑的是我可以在 Windows 命令提示符下使用命令 gcc main.s -o MAIN
并创建一个完美运行的可执行文件 (MAIN.exe)(从命令行)。
所以这表明我自动生成的汇编代码无法仅在我的 Netbeans 环境中构建。
有人可以解释这种行为的原因吗?
此外,Ramhound 指出我的 makefile 没有指向正确的位置。如这个问题的第一张图片所示,我选择了自动创建自己的 makefile 的项目选项。此外,makefile 允许我的 C 代码完美构建和 运行。只有当我尝试在 Netbeans 上构建我的汇编程序时才会出现问题。 我查看了 Darius 的 link 并没有提到仅针对汇编程序修改 makefile。
您尝试 运行 的程序集使用 Linux 系统调用,不能在 Windows 系统上 运行。
Windows没有稳定的系统调用接口,不建议用纯汇编编程。
部分main.s
的截图没有显示任何32位绝对寻址的使用。您的错误消息包括 main.s:21:(.stab+0x14): relocation truncated to fit: R_X86_64_32 against
.text'`,但第 21 行的指令是 RIP 相关的 LEA,因此它应该使用 x86_64_PC32 重定位。
您的 gcc 正在生成与位置无关的代码。
但错误提到 .stab
,所以问题可能是使用 32 位绝对地址的过时调试格式。也许您将 Netbeans 设置为 compile/assemble 和 -gstabs
之类的。在 ELF 目标上,-g
的默认格式是 DWARF,但 IDK 关于 Windows。
无论如何,通过关闭 Netbeans 中的调试符号来测试这个理论,看看错误是否消失。如果是这样,您就知道生成调试信息是问题所在。