如何解决修改LLVM位码的指针大小
我有一个从其他进程生成的位码文件。该文件保证为64位,但我想将位代码转换为32位,以便可以使用clang或gcc将其编译为32位应用程序。
我知道LLVM确实具有能够修改位码中所有指针的字节大小的功能,但是it is private只能在重置DataLayout时使用。还有一个setPointerSize
函数publicly exposed cerca 1.6版。我想知道是否有一种方法可以修改llvm位码的指针大小,而不管程序在做什么。
我更喜欢使用命令行,但是如果需要,我可以使用LLVM-C API。我还希望将位代码保留为二进制格式,而不是将其与文本格式LLVM IR进行相互转换。感谢所有在修改位码的数据布局方面有经验并且可以提供帮助的人。
解决方法
这可以做到,或者更有可能。
(唯一的)方法是使用所需的data layout创建一个新模块,在旧模块中循环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,并且如果编译器针对不同的目标进行编译,它将读取不同的头文件,并且会有不同的值?
还有其他类似问题。我认为处理这些整数常量是最大的问题,但这不是唯一的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。