修改 LLVM 位码的指针大小
Modify pointer size of LLVM bitcode
我有一个从另一个进程生成的位码文件。这个文件保证是 64 位的,但我想把 bitcode 转换成 32 位的,这样我就可以用 clang 或 gcc 将它编译成 32 位的应用程序。
我知道 LLVM 确实有一个函数可以修改 bitcode 中所有指针的字节大小,但是 it is private and only used when the DataLayout is being reset. There was also a setPointerSize
function publicly exposed cerca 版本 1.6。我想知道是否有一种方法可以修改 llvm 位码的指针大小,而不管程序正在做什么。
我更喜欢使用命令行,但如果需要我可以使用 LLVM-C API。我还希望将位码保留为二进制格式,而不是将其与文本格式 LLVM IR 相互转换。有修改bitcode的DataLayout经验的可以帮忙的,在此感谢。
可以做到,但更不可能。
(唯一)方法是在旧模块中使用 data layout you want, loop over the globals (both functions and global variables) 创建一个新模块,并在新模块中创建等效的全局变量。
但这可能行不通。检查 C 的 sizeof 可能有助于理解原因。
有一种方法可以在 IR 中实现 sizeof Foo
:将整数 0 转换为指向 Foo 数组的指针,然后获取该数组中条目号 1 的地址,然后将地址转换为整数。这为您提供了数组第一个条目的大小(条目号 0),即 sizeof Foo(带有您可能想要或不想要的一些填充)。还有一种通过查询DataLayout实现的方式,更简单,个人觉得也更有品味。
您不能依赖其他进程始终使用 cast-plus-address-cast 进程,因此当您在正在处理的模块中看到常量 32 时,您就有问题了。
- 比方说,这是只包含指针的结构的大小吗?在这种情况下,您应该将其更改为 16?
- 或者它是另一个结构的大小,一个包含一半指针和一半值的结构,在这种情况下您应该将其更改为 24?
- 或者是源代码中的32?也许源代码实现了一个允许字符串最长为 32 个字符的规范?
- 或者它是头文件中的 32,如果编译器针对不同的目标进行编译,它会读取不同的头文件并且会有不同的值?
还有其他类似的问题。我认为处理这些整数常量是最大的问题,但这不是唯一的问题。
我有一个从另一个进程生成的位码文件。这个文件保证是 64 位的,但我想把 bitcode 转换成 32 位的,这样我就可以用 clang 或 gcc 将它编译成 32 位的应用程序。
我知道 LLVM 确实有一个函数可以修改 bitcode 中所有指针的字节大小,但是 it is private and only used when the DataLayout is being reset. There was also a setPointerSize
function publicly exposed cerca 版本 1.6。我想知道是否有一种方法可以修改 llvm 位码的指针大小,而不管程序正在做什么。
我更喜欢使用命令行,但如果需要我可以使用 LLVM-C API。我还希望将位码保留为二进制格式,而不是将其与文本格式 LLVM IR 相互转换。有修改bitcode的DataLayout经验的可以帮忙的,在此感谢。
可以做到,但更不可能。
(唯一)方法是在旧模块中使用 data layout you want, loop over the globals (both functions and global variables) 创建一个新模块,并在新模块中创建等效的全局变量。
但这可能行不通。检查 C 的 sizeof 可能有助于理解原因。
有一种方法可以在 IR 中实现 sizeof Foo
:将整数 0 转换为指向 Foo 数组的指针,然后获取该数组中条目号 1 的地址,然后将地址转换为整数。这为您提供了数组第一个条目的大小(条目号 0),即 sizeof Foo(带有您可能想要或不想要的一些填充)。还有一种通过查询DataLayout实现的方式,更简单,个人觉得也更有品味。
您不能依赖其他进程始终使用 cast-plus-address-cast 进程,因此当您在正在处理的模块中看到常量 32 时,您就有问题了。
- 比方说,这是只包含指针的结构的大小吗?在这种情况下,您应该将其更改为 16?
- 或者它是另一个结构的大小,一个包含一半指针和一半值的结构,在这种情况下您应该将其更改为 24?
- 或者是源代码中的32?也许源代码实现了一个允许字符串最长为 32 个字符的规范?
- 或者它是头文件中的 32,如果编译器针对不同的目标进行编译,它会读取不同的头文件并且会有不同的值?
还有其他类似的问题。我认为处理这些整数常量是最大的问题,但这不是唯一的问题。