问题标签 [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.

0 投票
1 回答
471 浏览

compiler-construction - 编写 COFF 目标文件...如何引用外部符号

我要编写我的第一个编译器(好吧……大部分工作是通过使用 ANTLR 完成的,但仍然需要努力)……我已经做了以下事情:

  • 为非常非常简单的计算实现了一个工作解释器(+、-、*、/、^ - 当然具有适当的优先级,这并不难实现)
  • 创建了一个基本的汇编代码发射器(实际上几乎比编写解释器更容易,因为我使用了一种相当简单的基于“堆栈”的方法来处理计算 - 例如:“push var1,push var2,add” - 这很容易转化为简单的 mov / add 指令
  • 能够组装成 .exe(使用 ml64)并执行生成的可执行文件

现在我的问题是 - 如果我想自己创建 COFF 目标文件,我如何在库/其他目标文件中引用外部符号?

我的意思是,例如(如果我想调用 printf),当我在 ml64 中执行此操作时,它的工作方式如下:

但是我到底要在 COFF 文件中写入什么而不是“printf”?

其他一切并不难实现,但我完全不知道如何去引用库/其他目标文件......嗯......

编辑:固定格式(对不起)+澄清

0 投票
2 回答
1157 浏览

operating-system - 创建许多可执行文件格式有什么用?

我正在学习操作系统概念。我已经设法自己创建了一个引导加载程序。我生成的每个可执行文件都在 BIN 中。

我看到微软在其系统中使用了 PE 文件格式。同样,Unix 使用 COFF。

这些多种文件格式有什么用?与其他相比,它们是否具有任何文件保护或附加功能?

0 投票
0 回答
183 浏览

c++ - 从 .pdb 或 .obj 加载热补丁代码的符号

我目前正在开发一种工具,该工具允许我即时更改 C++ 代码。更改的文件在后台编译,从 .obj 加载,重新定位和链接,并修补到正在运行的进程中。到目前为止,这工作正常。

但是,我无法为新函数加载符号,以便调试器可以看到它们。我尝试使用 SymLoadModuleEx 创建一个虚拟模块并通过 SymAddSymbol 添加符号,但这不起作用。

最终,我希望能够为新功能添加符号和行信息。我可以从 .pdb 文件或存储在 .obj 中的 COFF 信息(我都有)来做到这一点,但我似乎缺少通知调试器的关键部分。

有没有我错过的功能?还是调试器理解的 RaiseException 的未记录代码(类似于命名线程)?

我使用 Visual Studio,但非常感谢任何有助于使其在 VS 调试器或 WinDBG 中工作的帮助。

0 投票
1 回答
376 浏览

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 格式?

提前感谢您的任何支持。

0 投票
1 回答
540 浏览

c++ - 如何从通用函数符号计算或指定 COFF 符号表的“值”?

我正在开发类似汇编程序的 nasm,现在我正在编写一个生成 COFF 格式文件的过程。

我的问题非常具体,我遇到了名为valueon的字段COFF Symbol Table。我找不到计算或指定它的方法。

我阅读了文档Microsoft Portable Executable and Common Object File Format Specification。在我提到的一篇文章之后:

我想知道如何指定Value字段来定义基本的 C 函数符号,例如_test

该文件称Value字段表示relocatable address。怎么知道?

0 投票
1 回答
2248 浏览

visual-c++ - 垃圾箱输出,是什么意思?

如果我做这样的事情:

我得到的输出类似于:

第二列(.data、.gfids、.rdata...)代表节名。但是第一列是什么?截面尺寸?

0 投票
1 回答
184 浏览

dll - .dll 导入部分下面的 Dumpbin 输出含义

这是我在运行 dumpbin .exe 文件时得到的一部分。

这部分在 SECTION HEADER #2 ( .rdata name...) 下我不知道 KERNEL32.dll 下的这些行是什么意思?谢谢

0 投票
0 回答
30 浏览

windows - 更改 obj 代码部分

我试图在编译之后但在链接之前更改代码部分(在创建 obj 之后但在它链接到 exe 之前)。

我能够找到代码部分并在其末尾添加任意数量的 NOP,并且 exe 工作正常;但是,如果我在该部分的开头或中间添加 NOP,则 exe 会崩溃。

我确实根据更改大小(增量)更新了所有节标题(指向数据的指针和指向重定位的指针),但我可能遗漏了我需要修复的其他内容。由于它在我追加到末尾时起作用,所以感觉就像是一个段内偏移问题。

0 投票
1 回答
244 浏览

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”的引用)。

关于如何解决这个问题的任何想法/解决方案?我已经仔细检查过,编译汇编代码生成的目标文件包含在链接步骤中。

0 投票
1 回答
238 浏览

winapi - 使 MS Visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号

是否可以让 MS Visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号?

换句话说,我需要更改dword ptr引用某些 IAT 的调用,例如:

外部符号调用,例如:

这意味着编译后我不需要链接,因为显然这是不可能的。因此,作为一个产品,我想获得(MS)COFF.obj文件,这些文件对 Win32 API 进行了如此不寻常的调用。