问题标签 [coff]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
compiler-construction - 编写 COFF 目标文件...如何引用外部符号
我要编写我的第一个编译器(好吧……大部分工作是通过使用 ANTLR 完成的,但仍然需要努力)……我已经做了以下事情:
- 为非常非常简单的计算实现了一个工作解释器(+、-、*、/、^ - 当然具有适当的优先级,这并不难实现)
- 创建了一个基本的汇编代码发射器(实际上几乎比编写解释器更容易,因为我使用了一种相当简单的基于“堆栈”的方法来处理计算 - 例如:“push var1,push var2,add” - 这很容易转化为简单的 mov / add 指令
- 能够组装成 .exe(使用 ml64)并执行生成的可执行文件
现在我的问题是 - 如果我想自己创建 COFF 目标文件,我如何在库/其他目标文件中引用外部符号?
我的意思是,例如(如果我想调用 printf),当我在 ml64 中执行此操作时,它的工作方式如下:
但是我到底要在 COFF 文件中写入什么而不是“printf”?
其他一切并不难实现,但我完全不知道如何去引用库/其他目标文件......嗯......
编辑:固定格式(对不起)+澄清
operating-system - 创建许多可执行文件格式有什么用?
我正在学习操作系统概念。我已经设法自己创建了一个引导加载程序。我生成的每个可执行文件都在 BIN 中。
我看到微软在其系统中使用了 PE 文件格式。同样,Unix 使用 COFF。
这些多种文件格式有什么用?与其他相比,它们是否具有任何文件保护或附加功能?
c++ - 从 .pdb 或 .obj 加载热补丁代码的符号
我目前正在开发一种工具,该工具允许我即时更改 C++ 代码。更改的文件在后台编译,从 .obj 加载,重新定位和链接,并修补到正在运行的进程中。到目前为止,这工作正常。
但是,我无法为新函数加载符号,以便调试器可以看到它们。我尝试使用 SymLoadModuleEx 创建一个虚拟模块并通过 SymAddSymbol 添加符号,但这不起作用。
最终,我希望能够为新功能添加符号和行信息。我可以从 .pdb 文件或存储在 .obj 中的 COFF 信息(我都有)来做到这一点,但我似乎缺少通知调试器的关键部分。
有没有我错过的功能?还是调试器理解的 RaiseException 的未记录代码(类似于命名线程)?
我使用 Visual Studio,但非常感谢任何有助于使其在 VS 调试器或 WinDBG 中工作的帮助。
linker - 链接不同类型的目标文件
我正在尝试链接最初由两个不同的汇编程序创建的目标文件。我们有一些遗留的汇编代码,这些代码使用 68332 处理器的旧 MRI 汇编器编译成目标文件。我们正在使用 GNU Binutils m68k v2.24 开发一个新的应用程序。我们想使用由旧汇编程序构建的原始目标文件而不作任何更改。我已经配置了我们的构建环境来做到这一点。由于历史原因,我们的构建环境链接到三种输出格式:Srecord、ieee 和 ELF。当我运行时,Srecord 和 ieee 格式成功且没有错误。但是,对于 ELF 输出格式,我收到以下错误:
m68k-elf-ld:无法合并文件的目标特定数据
因此,不会创建 Elf 文件。
我首先尝试了解此错误消息可能意味着什么,但我无法理解。如果有人知道 GNU Binutils ld 文档足以指出错误定义的定义位置,我将不胜感激。
我实际上已经加载了我们的目标并运行了 Srecord 输出。它似乎像以前一样通过了许多测试,因此它似乎在某种程度上正在运行。
看起来我们的旧目标文件可能是 coff 格式的。我猜这就是问题所在。有没有办法将 coff 文件转换为 ELF 格式?
提前感谢您的任何支持。
c++ - 如何从通用函数符号计算或指定 COFF 符号表的“值”?
我正在开发类似汇编程序的 nasm,现在我正在编写一个生成 COFF 格式文件的过程。
我的问题非常具体,我遇到了名为value
on的字段COFF Symbol Table
。我找不到计算或指定它的方法。
我阅读了文档Microsoft Portable Executable and Common Object File Format Specification。在我提到的一篇文章之后:
我想知道如何指定Value
字段来定义基本的 C 函数符号,例如_test
该文件称Value
字段表示relocatable address
。怎么知道?
visual-c++ - 垃圾箱输出,是什么意思?
如果我做这样的事情:
我得到的输出类似于:
第二列(.data、.gfids、.rdata...)代表节名。但是第一列是什么?截面尺寸?
dll - .dll 导入部分下面的 Dumpbin 输出含义
这是我在运行 dumpbin .exe 文件时得到的一部分。
这部分在 SECTION HEADER #2 ( .rdata name...) 下我不知道 KERNEL32.dll 下的这些行是什么意思?谢谢
windows - 更改 obj 代码部分
我试图在编译之后但在链接之前更改代码部分(在创建 obj 之后但在它链接到 exe 之前)。
我能够找到代码部分并在其末尾添加任意数量的 NOP,并且 exe 工作正常;但是,如果我在该部分的开头或中间添加 NOP,则 exe 会崩溃。
我确实根据更改大小(增量)更新了所有节标题(指向数据的指针和指向重定位的指针),但我可能遗漏了我需要修复的其他内容。由于它在我追加到末尾时起作用,所以感觉就像是一个段内偏移问题。
c++ - 使用汇编嵌入数据时出现“未定义引用”错误,使用 mingw-w64 为 windows 编译(COFF 而不是 ELF)
在另一个 Stackoverflow Q/A 中,有一篇文章展示了如何在程序集中嵌入任意数据并在 C++ 中引用它。
这在 Linux 中运行良好,但在为 Windows 编译时(使用 mingw-w64),程序集必须不同,因为可执行文件使用 COFF 格式而不是 ELF。
我当前用于嵌入数据的程序集如下(对于 COFF):
(我使用“.scl 2”,因为存储类“2”显然是全局/外部的,我使用“.type 50”作为数据,因为“50”是字符数组的值,我'我使用“.type 15”作为data_size,因为“15”是无符号长整数的值(所有这些都在这里指定))
我仍然使用相同的头文件来引用数据:
程序集编译得很好,程序的其余部分也是如此。链接时出现问题,链接器声称 data_bin 和 data_bin_size 是未定义的,即使我在汇编代码中定义了它们(未定义对“data_bin”的引用)。
关于如何解决这个问题的任何想法/解决方案?我已经仔细检查过,编译汇编代码生成的目标文件包含在链接步骤中。
winapi - 使 MS Visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号
是否可以让 MS Visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号?
换句话说,我需要更改dword ptr
引用某些 IAT 的调用,例如:
外部符号调用,例如:
这意味着编译后我不需要链接,因为显然这是不可能的。因此,作为一个产品,我想获得(MS)COFF.obj
文件,这些文件对 Win32 API 进行了如此不寻常的调用。