我正在开发一台我没有管理权限的Windows机器上.我想使用CMake进行编译,由于管理限制,我不能简单地下载和安装它.
我还想避免从源代码编译CMake(如果可能的话).是否有可用于Windows的便携式二进制文件,只允许使用CMake?
根据我和其他人的经验(http://webster.cs.ucr.edu/Page_TechDocs/pe.txt),PE/COFF规范文档错误地声称序数表中包含的出口地址表索引是相对的到Ordinal Base,甚至给出了一个不正确的例子(第5.3节).实际上,Ordinal Table中的索引是基于0的索引到正常情况下的Ordinal Base = 1的地址表中.我在VS Studio生成的PE库和系统库(如Kernel32.dll)中看到了这一点.
我的问题是,你有没有观察过一个带有Ordinal Base的二进制数不等于1?我想知道这是一个off-by-one错误,还是Ordinal Base从未应用于Ordinal Table条目.
我刚刚阅读了关于它们在磁盘上的文件中的偏移,RVA和VA一旦被加载到内存中.我还读到,如果一个PE文件完全像在磁盘中一样加载到内存中,那么RVA将与文件偏移相同(并且发生这种情况将是非常不寻常的).
我怀疑的是 - 在正常情况下,这些RVA相对于什么?特定PE数据结构的开始?
编辑:通过PE数据结构我的意思是 - PE头,DOS头,DOS存根,PE文件头,图像可选头,节表和数据目录.
我需要字节大小,IMAGE_OPTIONAL_HEADER.SizeOfImage似乎向上舍入到(不确定)边界并且大于实际文件大小.
我正在尝试读取PE文件.
问题是数据使用RVA指针,而我需要在文件中偏移
以获得我需要的东西.如何将RVA转换为文件中的偏移量?
我有一个用C编写的可执行文件,其中包含一些我想在ac#application中使用的函数.我以前写了很多dll,并且能够通过__declspec(dllexport)在函数声明之前使用函数.我可以用可执行文件执行此操作吗?可执行文件实际上会导出函数吗?
有几个问题涉及这个问题的某些方面,但似乎都没有完全回答它.整个问题可归纳如下:
我的特定用例是一个解释器,我想让用户能够用解释器二进制文件和他提供的代码生成一个单独的文件可执行文件(解释器二进制文件是必须用它修补的可执行文件).用户提供的代码作为二进制数据).
类似的情况是自解压存档,其中程序(存档实用程序,如zip)能够构造这样的可执行文件,其中包含预构建的解压缩程序(已编译的可执行文件)和用户提供的数据(内容)存档).显然,此过程中不涉及编译器或链接器(感谢,Mathias为注释并指出7-zip).
使用现有问题,解决方案的特定路径如下所示:
将数据附加到exe - 这涉及向任意exes添加任意数据的方面,而不涉及如何实际访问它(基本上简单的追加通常有效,对于Unix的ELF格式也是如此).
在没有/ proc/self/exe的情况下查找当前可执行文件的路径 - 与上述相同,这将允许获取用于打开exe的文件名,以访问添加的数据.还有更多这类问题,但是它们都没有特别关注获得适合于实际将二进制文件作为文件打开的目的的路径问题(单独的目标可能(?)更容易实现 - 真的你不要甚至不需要路径,只是打开阅读的二进制文件.
除了填充二进制文件并打开文件以进行读取之外,还可能存在其他可能更优雅的方法.例如,可执行文件可以使得以后使用任意大小的数据对其进行修补变得相当简单,因此它它出现在某个正确的数据段"内"?(我真的找不到任何东西,对于固定大小的数据,它应该是微不足道的,尽管除非可执行文件有一些哈希值)
这可以做得相当好,与标准C的偏差尽可能小吗?甚至或多或少的跨平台?(至少从维护的角度来看)请注意,如果执行二进制数据添加的程序不依赖于编译器工具(用户可能没有),那么首选,但是需要这些工具的解决方案也可能有用. .
请注意已经编译的可执行标准(上面列表中的第一点),这需要一种完全不同于C/C++与GCC之类的问题中描述的解决方案:静态地将资源文件添加到可执行文件库或SDL嵌入图像内部的程序可执行文件中,要求嵌入数据编译时.
补充说明:
上面列出并在一些注释中提出的明显方法的问题,即只是附加到二进制文件并使用它,如下所示:
我有以下C程序:
#include <windows.h>
void __cdecl mainCRTStartup() {
DWORD bw;
HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(hfile, "Hello, World!\r\n", 15, &bw, 0);
ExitProcess(0); /* Needed for successful (0) exit. */
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令行使用GCC 4.8.2编译它:
i686-w64-mingw32-gcc -s -Os -fno-ident -fno-stack-protector -fomit-frame-pointer \
-fno-unwind-tables -fno-asynchronous-unwind-tables -falign-functions=1 \
-mpreferred-stack-boundary=2 -falign-jumps=1 -falign-loops=1 -mconsole \
-nostdlib -nodefaultlibs -nostartfiles -o h.exe h.c -lkernel32
Run Code Online (Sandbox Code Playgroud)
生成的.exe文件长度为2048字节.如何使用MinGW将其缩小,最好是1024字节,或者(甚至更好)最多512字节?
我更喜欢没有编写汇编代码的解决方案,但我也对组装解决方案感兴趣.
我试图-Wl,-N减少部分(段)的数量,但是在Wine中运行.exe时会导致段错误.
该文章认为,480个字节是可能的.它使用以下设置:
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")// Merge sections
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
#pragma optimize("gsy", …Run Code Online (Sandbox Code Playgroud) 当我编译Delphi项目并指示编译器创建内存映射文件(* .map)时,它在文件顶部包含对已用内存段的描述。
例:
Start Length Name Class
0001:00401000 00475600H .text CODE
0002:00877000 00004998H .itext ICODE
0003:0087C000 00030410H .data DATA
0004:008AD000 00009170H .bss BSS
0005:00000000 00000278H .tls TLS
Run Code Online (Sandbox Code Playgroud)
查看PE节表时,仅列出 “ .text”和“ .itext”以外的其他节。
该“ .itext”段的目的是什么,它与“ .text”有什么区别?它是Delphi / Borland / Embarcadero的特定扩展吗?