当我尝试调试可执行文件时:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
Run Code Online (Sandbox Code Playgroud)
这究竟是什么意思?
符号表是否附加到可执行文件?
当我尝试执行gcc -m32 main.c -o main在Windows子系统Linux上编译的32位文件时,我收到以下错误:bash: ./main: cannot execute binary file: Exec format error.
如果我编译它没有 -m32它运行.
在WSL上运行32位可执行文件的任何解决方案?
谢谢.
executable gcc 32-bit executable-format windows-subsystem-for-linux
我想知道为什么我们从编译.c文件得到的.o文件打印出"Hello,World!" 大于Java .class文件,也打印"Hello,World!"?
我正在阅读PE格式的文档。在文档中,“图像”一词多次出现,并且似乎总是与“可执行文件”一词一起出现。然而,它并没有解释为什么“可执行文件”被称为“图像文件”。
维基百科上有一个页面条目列表,其中几个术语包含“图像”,例如“磁盘映像”,“ISO映像”,甚至是“可执行文件”的链接,但它仍然没有解释“图像”的含义这样的背景。
经过谷歌搜索,我发现这个网站对“图像”给出了合理的解释:
(1) 在计算机科学中,图像是存储在第二个存储设备上的存储设备(例如硬盘驱动器或 CD-ROM)内容的精确副本。另请参阅磁盘映像。
那么,假设“ISO 映像”是光盘内容的精确复制品,那么“可执行映像”是什么呢?为什么可执行文件被称为“图像文件”?
Core转储上的维基百科页面说
在类Unix系统中,核心转储通常使用标准的可执行映像格式:
Run Code Online (Sandbox Code Playgroud)a.out in older versions of Unix, ELF in modern Linux, System V, Solaris, and BSD systems, Mach-O in OS X, etc.
这是否意味着核心转储本身是可执行的?如果没有,为什么不呢?
编辑:由于@ WumpusQ.Wumbley coredump_filter在评论中提到了一个问题,或许上面的问题应该是:是否可以生成核心转储,使其可以自行执行?
我正在尝试使用 x86_64 上的链接器脚本更改堆栈的起始位置。我能够使用这个移动我的可执行起始地址:
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x200000)); . = SEGMENT_START("text-segment", 0x200000) + SIZEOF_HEADERS;
Run Code Online (Sandbox Code Playgroud)
我像这样改变了我的全局变量:
.data ALIGN(0x10000000) :
{
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下内容来移动堆栈区域:
. = 0x50000000;
.stack :
{
stack_start = .;
PROVIDE( stack_start = . );
*(.stack)
. += 0x2000;
stack_end = . ;
PROVIDE( stack_end = . );
}
Run Code Online (Sandbox Code Playgroud)
但这并没有让我去任何地方。
这是我用来测试堆栈位置的测试程序:
#include <stdio.h>
#include <stdlib.h>
int global_var = 555;
void test()
{
int local_test = 666;
printf("address of global_var: %p\n", &global_var);
printf("address of local_test: %p\n", &local_test); …Run Code Online (Sandbox Code Playgroud) 我知道PE是COFF的修改版,PE+是PE的64位支持的修改版,但是PEI是什么?我说 PE 和 PEI 之间没有区别并且它们可以互换使用是否正确?
我正在编译一个简单的汇编代码(Intel 语法、x86、Linux)打印“Hello World!”。这里是:
SECTION .rodata
msg: db 'Hello world!', 0xA
msg_len: equ $ - msg
SECTION .text
global _start
_start:
mov eax, 4 ; `write` system call
mov ebx, 1 ; to stdout
mov ecx, msg
mov edx, msg_len
int 0x80
mov eax, 1 ; `exit` system call
xor ebx, ebx ; exit code 0
int 0x80
Run Code Online (Sandbox Code Playgroud)
我使用以下命令编译它:
SECTION .rodata
msg: db 'Hello world!', 0xA
msg_len: equ $ - msg
SECTION .text
global _start
_start:
mov eax, 4 ; …Run Code Online (Sandbox Code Playgroud) 我编译了一个 C++ 程序,使其在发布模式下有一个 EXE 文件。当我在编辑器中打开 EXE 文件时,我看到一些文本块,其中大部分是程序中使用的低级函数的名称。
人们总是说计算机只能理解二进制机器代码。那么,可执行程序文件中这些人类可读的文本存在的目的是什么呢?为什么计算机需要函数名来运行程序?

IDE:Visual Studio 2015 RC
平台:Windows 8.1 x64
编译器命令行选项:
/GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl
/Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS"
/errorReport:prompt /GT /WX- /Zc:forScope /Gd /Oy /Oi /MD
/Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Ot
/Fp"x64\Release\<ProjectName>.pch"
Run Code Online (Sandbox Code Playgroud)
链接器命令行选项:
/OUT:"<SolutionPath>\x64\Release\<ProjectName>.exe"
/MANIFEST /LTCG /NXCOMPAT
/PDB:"<SolutionPath>\x64\Release\<ProjectName>.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib"
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib"
"uuid.lib" "odbc32.lib" "odbccp32.lib"
/MACHINE:X64 /OPT:REF /PGD:"<SolutionPath>\x64\Release\<ProjectName>.pgd"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"x64\Release\<ProjectName>.exe.intermediate.manifest"
/OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
Run Code Online (Sandbox Code Playgroud)
我对rcgldr 的答案进行了更改。我进行了项目设置更改,将命令行开关更改\MD为 …
我正在创建一个 ELF 可执行文件,我需要知道操作系统需要哪些部分才能加载和执行它。
细节:
操作系统:Ubuntu 10.04(64 位) 内核版本:2.6.32-24 架构:i386
我意识到以下可能是必要的:
还有其他人吗?
请解释RVA和VA的含义
据我所知,可执行文件的扩展名 .com .exe 等适用于操作系统。它与底层 ISA(无论是 x86 还是 SPARC)无关。我对么?.com 可执行文件只能在 Windows 操作系统上运行吗?.com 可执行文件是遗留文件吗?