汇编程序运行后立即崩溃,没有打印出Hello World消息。
好吧,基本上我只是在编写一个C程序来构建我的对象文件,然后分别使用NASM和LD 从它们创建执行 我编写的程序对NASM和LD进行了正确的电话,但是我要么使用-f win32/win64(我在64位Windows 7机器上)编译了罚款,要么没有其他选项失败. . 正确的?如果程序编译并创建了EXE,它将运行并立即崩溃而无需打印Hello World消息.我真的很想跳入集会.一些帮助 ? section .text global _start ;must be declared for linker (ld) _start: ;tells linker entry point mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4
0 2023-12-07
编程技术问答社区
对主ld的未定义引用
我正在尝试链接到文件 - 一个包含主函数的C文件和一个仅跳到主的ASM文件. 我已经安装了mingw. 我的文件: //kernel.c void some_function(){ } void main(){ char* video_memory = (char*) 0xb8000; *video_memory = 'X'; some_function(); } ;kernel_entry.asm [bits 32] [extern main] call main jmp $ 我称构建的命令: gcc -ffreestanding -c kernel.c -o kernel.o nasm kernel_entry.asm -f elf -o kernel_entry.o ld -o kernel.bin -Ttext 0x1000 kernel_entry.o kernel.o 我遇到的错误: kernel_entry.o:(.text+0x1): u
0 2023-12-07
编程技术问答社区
在windows下编译汇编(NASM与int 80h系统调用)。
我正在学习编码组装(NASM).但是我有问题,我在线编码,但我想将下面的代码转换为EXE并运行它. (通过单击双击,而不是在CMD中).而且我不知道该怎么做.我知道我必须使用https :://www.nasm.us的nasm和一个链接器.对于链接器,我想使用Mingw中的LD.但是我不知道该怎么做.我没有在互联网上找到任何东西 section .data msg: db "Eneter your name : ", 10 msg_l: equ $-msg hello: db "Hello, " hello_l: equ $-hello section .bss name: resb 255 section .text global _start: _start: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, msg_l int 80h mov eax, 3 mov ebx, 0 mov ecx, name mov edx, 2
0 2023-12-07
编程技术问答社区
我如何在windows上与clang链接?
这是一些组装.使用Windows Clang,我可以写clang -c my.s并获取一个对象文件.我可以使用 链接它 " C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ buildTools \ VC \ wools \ MSVC \ MSVC \ 14.29.30133 \ bin \ bin \ hostx64 \ x64 \ x64 \ x64 \ link.exe.exe.exe" (libpath是c:/program文件(x86)/windows套件/10/lib/10.0.20348.0/um/x64/) 但是,我无法弄清楚如何使用Clang的链接来完成.我不断得到"错误:my.o:未知文件类型" 我在Linux机器上,尝试了 clang my.s --target=x86_64-windows-gnu "-L/run/media/eric/win10/Program Files
0 2023-12-06
编程技术问答社区
在Windows上针对可执行文件的正确链接方式是什么?
我需要使用插件中的主可执行文件中的一些符号. 链接到可执行文件会导致以下链接器错误: i686-w64-mingw32-g++ example.cpp -shared -I.. -std=c++11 -o test.dll ../../test.exe -static-libgcc -static-libstdc++ -fvisibility=hidden [..]/test.exe:cygming-crtbegin.c:(.text+0x500): multiple definition of `__gcc_register_frame' /usr/lib/gcc/i686-w64-mingw32/5.1.0/crtbegin.o:cygming-crtbegin.c:(.text+0x0): first defined here [..]/test.exe:cygming-crtbegin.c:(.text+0x560): multiple definition of `
0 2023-12-05
编程技术问答社区
Win32汇编-外部函数的命名('@'的含义)
正如我所看到的,extern汇编代码中的winapi函数具有_ExitProcess@4之类的名称. @4部分的含义是什么,以及如何确定@之后要使用的数字? 我知道这与我们正在链接的DLL有关,但是在许多情况下,@之后要使用的数字,这导致了许多讨厌的undefined reference错误. 解决方案 作为Andreas H答案说,@之后的数字是函数返回之前从堆栈中删除的函数的数量.这意味着应该很容易确定该数字,因为它也是您需要在堆栈上推动以正确调用该功能的字节数.它应该是通话乘以4之前的推送说明的数量.在大多数情况下,这也将是传递给该函数的参数数量乘以4. . 如果要仔细检查是否获得正确的号码,并且已安装了Microsoft Visual Studio,则可以从开发人员命令提示符中找到装饰的符号名称: C:\> dumpbin /headers kernel32.lib | find "ExitProcess" Symbol name : _Exi
0 2023-12-04
编程技术问答社区
载入警告:找不到条目符号_start
我正在学习组装编程.下面是打印" Hello,World!"的简单程序.当程序运行完美时,我会收到警告消息,而loading ld:警告:找不到输入符号_start;默认为0000000008048080 这是代码: section .data msg db 'Hello, world!', 0xa len equ $ - msg section .text global main main: mov ebx, 1 mov ecx, msg mov edx, len mov eax, 4 int 0x80 mov eax, 1 int 0x80 任何人都可以解释此警告的含义.我将nasm与ubuntu 14一起使用. 解决方案 使用标签_start而不是main作为精灵入口点. main意味着它就像C main函数,但这甚至不是一个函数(例如您不能ret ). P> 您
0 2023-11-27
编程技术问答社区
虚拟机Ubuntu上的NASM。无法执行二进制文件执行格式错误
组装一个简单的64位Hello World程序后,我会遇到错误. 我正在使用以下命令: nasm -f elf64 hello.asm -o hello.o successfull ld -o hello.o hello -m elf_x86_64 successfull ./hello 错误:无法执行二进制文件exec格式错误 我正在用64位Ubuntu虚拟机执行此操作. 我感谢您的帮助! 解决方案 错误: 错误:无法执行二进制文件exec格式错误 建议您的系统无法理解您要运行的可执行文件.在我的评论中,我要求您运行uname -a,以便我可以找出您在虚拟机中运行的系统类型.您将输出给出为: Linux dell 3.16.0-50-generic #67~14.04.1-Ubuntu SMP Fri...i686 i686 i686 GNU/LINUX i686告诉我们这是Ubuntu的32位版本,而不是64位.如果输出包括
2 2023-11-20
编程技术问答社区
gcc/ld: 动态连接中的-Wl,-rpath与静态连接中的-l是什么关系?
with/my/dir/path/foo.a and/ymy/dir/path/bar.a: 要使用gcc/g ++静态链接,一个人使用-L指定包含静态库的目录和-l来指定库的名称.在这种情况下,一个人会写gcc -L/my/dir/path -lfoo -lbar .... with/my/dir/path/foo.so and/my/dir/path/bar.so: 使用gcc/g ++动态链接,一种使用-Wl,-rpath,/my/dir/path.如何指定库的名称?命令gcc -L/my/dir/path -Wl,-rpath,/my/dir/path -lfoo -lbar ...正确吗?还是应该是gcc -L/my/dir/path -Wl,-rpath,/my/dir/path -Wl,-lfoo -Wl,-lbar ...?换句话说,是否需要通过-Wl,-l? 将库名称传递给链接器 解决方案 -l参数在静态和共享库中都很好地工作,但期望指定库的文件
0 2023-11-08
编程技术问答社区
为什么ELF可执行文件可以有4个LOAD段?
有一个远程64位 *NIX服务器可以编译用户提供的代码(应该用Rust编写,但我认为这并不重要,因为它使用了LLVM).我不知道它使用的是哪个编译器/链接器标志,但是编译的精灵可执行文件外观很奇怪 - 它具有4个负载段: $ readelf -e executable ... Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align ... LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000004138 0x0000000000004138 R 0x1000 LOAD
4 2023-11-08
编程技术问答社区
ld: 未定义的符号 vs ld: 未定义的引用
GNU Binutils LD中的这些错误有什么区别? 未定义的参考 未定义的符号 我对未定义的参考有很好的理解:例如,当加载程序找不到函数的实现时.我很想知道不确定符号的原因. 解决方案 例如.当您使用尚未定义的符号在Linkerscript中进行一些算术时.在我的情况下,这主要是由于错别字. _syma = 1 ; _syna += 1 ; /* error: undefined symbol `_syna' referenced in expression */ 或 _syma = 1 ; _symb = _syna + 1 ; /* error: undefined symbol `_syna' referenced in expression */ 当您将输出部分分配给未定义的符号时,您会收到另一个错误: _syma = 1 ; .text _syna : /* error: non constant or forward ref
6 2023-11-06
编程技术问答社区
cmake对函数的未定义引用
下面的项目结构是一个简化的示例.我试图将其归结为最少的文件来复制我的问题. . ├── CMakeLists.txt ├── subdir1 │ ├── CMakeLists.txt │ └── subsubdir1 │ ├── CMakeLists.txt │ ├── Example.cpp │ └── Example.h └── subdir2 ├── CMakeLists.txt ├── main.cpp └── subsubdir1 ├── CMakeLists.txt ├── ExampleCreator.cpp └── ExampleCreator.h ./cmakelists.txt cmake_minimum_required(VERSION 2.8) project(test) macro(add_sources) file (R
10 2023-11-06
编程技术问答社区
g++编译错误:对一个存在的共享库函数的未定义引用
我最近在Ubuntu机器上安装了 HDF5 库,现在很难链接到导出功能.我写了一个简单的测试脚本 readhdf.cpp 来解释问题: #include int main(int argc, char * argv[]) { hid_t h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT); return 0; } 编译命令是 g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \ -L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp 返回以下错误 /tmp/cc6DXdxV.o: In function `main': readHDF.cpp:(.text+0x1f): undefined reference to `H5check_versi
8 2023-11-06
编程技术问答社区
获取对std::thread::_M_start_thread的未定义引用
我正在构建一个使用第三方lib(box2d-mt)的应用程序,该应用程序是我从来源构建的.链接时,我会得到此不确定的参考错误: b2Threading.cpp:(.text._ZNSt6threadC2IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_[_ZNSt6threadC5IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_]+0xa4): undefined reference to 'std::thread::_M_start_thread(std::shared_ptr, void (*)())' 我正在用G ++建造,并与 链接 -lBox2D -lpthread -lrt -ldl -lstdc++ 另外,我正在用 编译 -std=c++11 看libstdc ++.a我可以看到一个类似的符号(它是" t"): nm -C /usr/li
8 2023-11-06
编程技术问答社区
有什么办法可以忽略未使用的未定义引用?
假设我有两个源文件 - undeferr.cpp : #include void UndefFunc(); void Func2(){UndefFunc();} void Func1(){printf("Hi\n");} 和 main.cpp : void Func1(); int main(){ Func1(); return 0; } 正如您在 undeferr.cpp 中看到的Func2()触发错误,因为它使用未定义的UndefFunc().但是,主要功能不在乎Func2()!根据一个相关的问题我可以通过一个选项 - - 未解决的 - 符号=忽略链接器中的对象,但我想要一个不同的事情.我需要一个链接器来知道是否使用了未定义的功能,然后失败. 问这个奇怪问题的原因是我正在尝试使用 解决方案 使用GCC 4.8.2我设法将代码链接而没有错误的链接: $ g++ -c main.cpp -O3 -flto $ g+
2 2023-11-06
编程技术问答社区
collect2:致命错误:ld以信号11终止[分段故障]
我实际上无法在C中编译简单的" Helloworld".当我键入" GCC Hello.c"时,输出为: 收集2:致命错误:LD用信号11终止[分割故障] 有人一个主意? 我试图重新安装GCC,G ++,Make,Cmake,Binutils.这些事情都没有用. 当我在终端中仅键入" LD"时,输出为: "分割故障" 解决方案 我可以用 解决它 sudo apt purge binutils sudo apt remove make sudo apt autoremove sudo apt install build-essential 我不知道为什么它可以与Build-Essenty ... 一起使用 其他解决方案 您可能正在遇到这个旧问题. 更新您的binutil. 例如: # yum groupinstall Development Tools 或 # apt-get install build-essential 并安装
20 2023-11-02
编程技术问答社区
ld: 未识别选项 '-push-state-no-as-need'。
我的构建失败了以下链接器错误消息: 失败::gust/usr/bin/g ++ -wall -wextra -werror -g -fsanitize = undefined,地址-wno -unused -parameter -fsanitize -fsanitize = undefined = undefined,地址-rdynamic *.o -o -o -o -sce -o sce -wl,sce -wl,,, -RPATH,/opt/QT59/lib/qt59/lib/lib/libqt5widgets.so.5.5.5.9.1/usr/local/lib/lib/libprotobuf.a -lpthread -lpthread -lutil -lgrpc++++++++++++++++++++++++/opt/p. 5.9.1/opt/qt59/lib/libqt5core.so.5.9.9.1 &&: /usr/bin/x86_64-linux-gnu-ld:未识
4 2023-11-02
编程技术问答社区
gccgo on Precise
尝试确切地与GCCGO链接时,我会得到此链接错误: matt@matt-1005P:~/src/gopath/src/meme$ gccgo cmd/meme/main.go -o meme /usr/bin/ld: cannot find -lgcc_s collect2: error: ld returned 1 exit status 有此错误的报告,但没有干净的解决方案.我该如何修复? gccgo(ubuntu/linaro 4.7.0-0ubuntu4)4.7.0 Linux Matt-1005p 3.2.0-24-Generic-Pae#38-ubuntu SMP Tue 5月1日16:40:26 UTC 2012 I686 I686 I686 I386 GNU/Linux 解决方案 最近在Golang-Nuts组中提出了这一点:用包装二进制文件与GCCGO编译. 这是ubuntu(go build -compiler gccgo -gcc
12 2023-11-02
编程技术问答社区
用libusb编译?
不管我得到什么, ./main.c:1:10: fatal error: libusb.h: No such file or directory #include "libusb.h" ^~~~~~~~~~ compilation terminated. 尝试的事情 gcc ./main.c -l/usr/include/libusb-1.0/ gcc ./main.c -l/usr/include/ gcc ./main.c -L/usr/include/libusb-1.0/ gcc ./main.c -L/usr/include/ 如果我尝试 #include "libusb-1.0/libusb.h" 而不是 #include "libusb.h" 它编译,但我得到 /tmp/ccLn3qR2.o: In function `main': main.c:(.text+0x17): undefined refere
4 2023-11-02
编程技术问答社区
ld链接问题。/usr/bin/ld: 无法找到[libraryname]。
IM使用Qmake在Ubuntu 9.10 上构建共享库 此共享库(a)对另一个共享库(b)具有依赖性. 项目B已成功构建. 在项目A的.pro文件中,我的libs变量看起来像: LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0 (我使用了完整的shlib名称,因为库版本不同.) 无论如何,当我尝试构建项目A时,它会在链接阶段中断,并打印错误消息: /usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0 collect2: ld returned 1 exit status make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1 make ***[release] Error 2 Exited with code 2 从错误消息中,我认为LD抱怨它无法找到LibDatelib文件,
4 2023-11-02
编程技术问答社区