问题标签 [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 回答
42 浏览

c++ - libbfd:使用 AMD64 机器类型写入 COFF 对象

我使用 libbfd 为包含 x86-64 代码的 Windows 写出 coff 目标文件的内容。写入符号、节和重定位有效,但生成的文件没有在 coff 标头中设置机器类型。0x8664我在文件开头手动写入以解决此问题。

有没有办法使用 bfd API 来设置对象的机器类型?

这是我编写目标文件的代码:

0 投票
1 回答
446 浏览

c++ - 如何为 Windows 创建 ELF 格式的 .o 和 .a 文件以用于 C++Builder 10.3.3?

我正在使用 Embarcadero C++Builder 10.3.3,并希望将 OpenCV 与它一起使用。但是,预编译的 OpenCV 包是用 Visual Studio 预编译的,它使用COFF格式。但是,C++Builder 64 位编译器在 Windows 下使用ELF格式,根据将现有 C++ 项目升级到 64 位 Windows

对象和库文件格式

  • BCC32 及其相关工具在 .obj 和 .lib 文件中使用 OMF。
  • BCC64 在 .o 和 .a 文件中使用 ELF。

当然,我尝试过用C++Builder编译OpenCV源代码,但是失败得很惨。谷歌搜索也没有发现任何真正有用的东西,除了其他人也没有成功。

有谁知道可以为Windows生成目标文件 ( )静态库 ( )以编译 OpenCV(对于Windows,而不是 Linux,因为 BCC64.EXE 是 Windows 编译器)的CMake 兼容编译器?.o.a

0 投票
0 回答
155 浏览

windows - Windows 对象文件 COFF 重定位说明

我正在尝试创建一个 x86-64 Windows COFF 对象文件,但我并不完全理解https://docs.microsoft.com/en-us/windows/win32/debug/pe中描述的不同类型的重定位-格式#x64-处理器。具体来说,我不确定做什么IMAGE_REL_AMD64_REL32(包括 _* 变体)IMAGE_REL_AMD64_SREL32IMAGE_REL_AMD64_PAIRIMAGE_REL_AMD64_SSPAN32做什么。他们有一些文档,但描述性不够,我找不到任何引用这些的外部资源。更准确地说,我不知道“跨度相关值”是什么意思,也不知道 REL32 到底是什么意思。我非常感谢有关此的任何信息。

编辑:好的,经过一番思考,我了解到 REL32 用于 RIP 相对寻址,而变体用于地址相对于指令开头的位置偏移量且符号指向其开头的情况。我仍然想知道 SREL32、PAIR 和 SSPAN32 是干什么用的……

0 投票
2 回答
86 浏览

c - __forceinline 生成一个函数符号 - 为什么?如何让它不这样做?

包含多个标题“ah”中的此代码:

在每个包含 'ah' 的对象文件中生成一个函数符号 - 测试对象是:

使用 Visual Studio 2019 (Community Ed.) v16.10.1 将其编译为目标文件:

MSYS2 binutils 'nm' 工具还报告一个外部 'T f' 符号。

我试图在 MSVC 中找到与 GCC 等效的东西

,当上述代码由 gcc v11 编译时,将 __forceinline 替换为属性((always_inline)) 和任何 -Ox 优化级别 x > 0 ,它不会为上述 f() 函数生成任何函数符号。

我比 MSVC 更习惯 GCC。

任何 MSVC 专家能否指出我如何使用 MSVC 生成无符号的始终集成到调用者函数的函数,当代码中没有函数的地址时,它不是采用可变参数,并且不是递归的(C 标准规定函数可以内联的条件)?

经过数小时搜索 MSVC 文档和网络后,这在我看来是不可能的。

对我来说,使用 __forceline / __attribute__((always_inline))
的全部意义在于:

A)不生成符号,因此没有多重定义符号或链接问题,并且不必考虑符号应该在哪个对象/库中定义 - (特别是对于 Windows,是否需要 __declspec( dllexport)与否)。没有符号,因此没有与符号链接相关的问题。

B)代码只在使用时实例化,不使用时消耗0字节

C)没有函数调用/返回开销(首先是内联的整个点)-但是这种节省通过寄存器保存+恢复代码有所减少-(但大多数函数调用/返回机制也保存+恢复寄存器)。

MSVC 采用的方法似乎是两全其美的方法,因此必须处理符号链接问题,并且总是会生成一个函数符号,无论是否使用都会占用空间。

请任何人都可以建议如何使用 MSVC 为 __forceinline 声明的函数禁用此函数符号生成?

0 投票
0 回答
48 浏览

c++ - .debug$S 部分的签名

我一直在尝试理解 .obj 文件中的 .debug$S 部分。但这太令人困惑了,几乎没有好的资源可用。我将不胜感激任何帮助!我现在拥有的 .obj 文件是在没有 crt 库的情况下编译的,它只有这个准系统函数:

该程序是使用这些标志编译的cl -Zi main.cpp /link /subsystem? /ENTRY:Entry /NODEFAULTLIB。使用 转储 .obj 文件dumpbin,.debug$S 看起来像这样:

就在我开始我的问题之前,我正在阅读的关于它的文件是这个文件和 github 上 Miscrosoft 的 cvdump的一些文件。

根据这个:

$$SYMBOLS 段的前四个字节用作签名,以指定 $$SYMBOLS 段中包含的符号和类型 OMF 的版本。(...) 如果签名是 0x00000001,则符号和类型 OMF 已被编写为符合 Microsoft CodeView 调试器的 4.0 版规范。签名的所有其他值都被保留。

前四个字节应该是 1,或者,如果不是,则保留这些值;所以我想尝试发现签名上的值“4”的含义是没有帮助的。

那么,签名之后的所有内容都应该是 CodeView 的东西,对吧?

我问这个是因为我不明白为什么它以“F1”开头。据我所知,一般的符号记录结构格式是这样的:

如果是 CodeView,则意味着“F1”是记录的长度,接下来的两个字节,也就是零,是记录索引。但事实证明,没有记录索引 0!我想前 12 个字节只是签名,因为我编译了另一个包含更多代码的程序,而前 12 个字节是相同的!前 12 个字节也是签名的一部分吗?

这一切意味着什么?

0 投票
1 回答
55 浏览

assembly - 内存段定义

我正在上一堂装配课,并且在试图找出一个问题时度过了一段糟糕的时光。我们有以下内容:

在此处输入图像描述

在我的一生中,我一直在尝试用谷歌搜索来解决这个问题,但找不到太多,不幸的是,我们的文字中没有任何内容可以指导我。我希望有人能够指导我解决这个问题。

1)。.text 部分加载到内存后的大小是多少?2)。.data 部分加载到内存后的 RVA 是多少?3)。磁盘上 .data 部分的物理大小是多少?

0 投票
0 回答
46 浏览

c++ - 使用 IDIA SDK 定位函数 - 奇怪的结果

我正在尝试在 .pdb 文件中查找特定函数。最初我编译了一个简单的“hello, world”程序,并使用 IDiaSymbol::get_name 方法分析了函数的名称,但我找不到我的函数。

在此之后,我尝试__declspec(naked) void myFunction(void){}在我的 helloworld.pdb 文件中包含一个函数,以便使用 IDiaSymbol::get_isNaked 方法来定位我的函数,但是,当我这样做时,根本没有打印任何内容 - 意味着其中没有裸函数我的代码。

编辑:在下面包括我的简单 .pdb 程序(是一个“hello world 程序”,现在包含一个简单的 __declspec(naked) 函数):

我对解析符号表的期望:在 *NIX 上解析 ELF 文件时会得到相同的结果 - 包含我为函数编写的实际名称的符号表,例如“.text myFunction”

实际打印出来的内容:许多 Winapi 函数和其他汇编程序创建的函数,可能是由于优化了我的函数。

例子:

符号名称:main
符号
名称:__acrt_thread_attach 符号
名称:_RTC_NumErrors 符号名称:ReadNoFence64
符号名称:__setusermatherr 符号名称:_RTC_SetErrorFuncW符号名称:IsProcessorFeaturePresent 符号
名称:GetLastError符号名称:__acrt_initialize