在ELF文件格式中,我们有一个Alignment字段,Segment Header Table即Program Header Table.
在 Windows PE 文件格式的情况下,他们将其带到下一个级别,节有两个对齐值,一个在磁盘文件中,另一个在内存中。PE 文件头指定了这两个值。
我对这种对齐一无所知。我们需要它做什么?如何以及在哪里使用它?同样,我不知道什么是二进制文件格式上下文中的对齐,但我们为什么需要它?
我使用 Tkinter 在 python 中编写了一个简单的 GUI 程序。我们将此程序称为“gui.py”。我的用户使用Portable Python从 USB 密钥在 Windows 计算机上运行“gui.py” ;在主机上安装任何东西都是不可取的。
我希望我的用户通过双击 USB 密钥根目录下的图标来运行“gui.py”。我的用户不关心 python 是什么,如果不需要,他们也不想使用命令提示符。我不希望他们关心 USB 密钥分配的驱动器号。我希望它可以在 XP、Vista 和 7 上运行。
我的第一个丑陋的解决方案是在 USB 密钥的根目录中创建一个快捷方式,并将快捷方式的“目标”属性设置为“(root)\App\pythonw.exe (root)\App\gui.py” ”,但我不知道如何在 Windows 快捷方式中执行相对路径,并且使用像“E:”这样的绝对路径似乎很脆弱。
我的下一个解决方案是在 USB 闪存盘的根目录中创建一个 .bat 脚本,如下所示:
@echo off
set basepath=%~dp0
"%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
Run Code Online (Sandbox Code Playgroud)
这似乎并不关心 USB 密钥分配的驱动器号,但它确实在我的程序运行时使 DOS 窗口保持打开状态。实用,但丑陋。
接下来我尝试了这样的 .bat 脚本:
@echo off
set basepath=%~dp0
start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
Run Code Online (Sandbox Code Playgroud)
(有关有趣引用的解释,请参见此处)
现在,在 GUI 打开之前,DOS 窗口会在屏幕上短暂闪烁。少一点丑!还是丑啊
真正的男人如何处理这个问题呢?从 USB 记忆棒在 Windows 机器上启动 python Tkinter GUI 的最不丑陋的方法是什么?
编辑:下面的所有答案都非常好(py2exe、pyinstaller、小.exe、.wsf 脚本。).wsf 解决方案是最简单的,所以我现在使用它。如果我想要更漂亮的图标和标准的 .exe 扩展名,我可能最终会切换到其他三种解决方案之一。感谢大家!
Microsoft关于 PE 可选标头标准字段中“入口点 RVA”字段的文档(第 25.2.3.1 节)指出该字段应为:
入口点的 RVA,需要指向字节 0xFF 0x25,后跟标记为 EXE 执行/读取或 DLL 标记为 0 的部分中的 RVA
这是什么意思?我检查了c#编译器生成的PE文件,发现一个RVA指向所描述的字节0xFF 0x25,但接下来的四个字节是0x00402000,超出了相对虚拟内存的范围,据我所知,这不是一个有效的RVA 。我知道有一个重定位(第 25.3.2 节)指向该类型为“IMAGE_REL_BASED_HIGHLOW”的值,但我也不知道这意味着什么。我还知道它应该调用 mscoree.dll 的“_CorExeMain”(我正在使用可执行文件),如第 25.3.1 节中所述,但我不明白如何执行。
是否有适用于 Windows 的开源程序提供与 Linux 相同的功能/lib/ld\xe2\x80\x91linux.so.2?
我无法强制 msvc10 将 const 对象放入 .rdata 部分。它总是以 .data 结尾,完美初始化(意味着没有动态初始化/运行时构造函数执行)。(使用“发布”构建的标准项目设置进行编译)。我不明白为什么以下代码不能将 'obj1' 放入 .rdata PE 部分:
typedef struct _Struct1 {
int m1;
_Struct1(int p1): m1(p1) {};
_Struct1() {};
} Struct1;
class Class1 {
public:
Class1() {};
Class1(int p1, int p2): m1(p1), m2_struct(p2) {};
int m1;
Struct1 m2_struct;
};
const Class1 obj1(1, 2);
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么 obj1 不转到 rdata(在 IDA 中检查)以及在当前情况下如何强制它?Tnx。
我怎么能告诉静态的Visual C ++放置一个全局变量在内存中的一个给定的绝对地址,像什么__attribute__((at(address)))呢?
DLL 函数调用的地址修复是一个多阶段过程:链接器将调用指令定向到间接跳转指令,并将间接跳转指令定向到 Windows 程序加载器将放置的 .rdata 部分中的导入表中的一个内存字在运行时加载 DLL 时函数的地址。
间接跳转指令必须由链接器生成,因为编译器不知道该函数会出现在 DLL 中。通过为每个函数只生成一条间接跳转指令来最小化程序文件的大小,无论从多少地方调用它。
鉴于此,显而易见的方法是在所有目标文件中的所有编译器生成的代码之后收集文本部分末尾的所有间接跳转指令,这似乎是我尝试带有 Microsoft 链接器 /nodefaultlib 开关的简单测试用例(它生成一个足够小的可执行文件,我可以理解完整的反汇编)。
当我以正常方式将一个小程序与 C 标准库链接时,生成的可执行文件足够大,我无法跟踪所有的反汇编,但据我所知,间接跳转指令似乎分散在各处一次可能是三个小组的代码。
有没有我失踪的原因?
我知道PE是COFF的修改版,PE+是PE的64位支持的修改版,但是PEI是什么?我说 PE 和 PEI 之间没有区别并且它们可以互换使用是否正确?
鉴于Random.exeWindows 上的一些,我如何确定
我可以使用文件资源管理器、其他工具或编程方法中的属性吗?
windows ×4
.net ×2
c++ ×2
dll ×2
linker ×2
binaryfiles ×1
elf ×1
file-format ×1
loader ×1
python ×1
tkinter ×1
visual-c++ ×1