我一直在阅读大会。根据我对编程语言的理解,似乎编译器(汇编程序......我知道在其他地方争论的两者之间存在微妙的差异),产生目标代码。一种不友好的机器语言没有指令。该目标代码由处理器解释,之后链接器使其成为可执行文件。我知道必须在正确的装配中说出每个处理器。 IE浏览器。 .386,.486,.586令我困惑的是通过MASM运行DOS程序和通过Linux运行相同程序而没有NASM或GAS之间的差异。如果将源代码编译成目标代码,那么它是不是跨平台?我可以像在Linux上一样轻松地从我的戴尔启动Windows。我在这里缺少什么?
此外,我一直在寻找一种查看目标代码的方法,这样我就不必通过Immunity Debugger来解密执行。只是我编写的源代码的指令机器代码指令。有没有办法在Linux中产生类似objdump的结果?
答案 0 :(得分:10)
现代的“x86”芯片至少可以理解三种不同的指令集 - 一种是DOS使用的16位指令集,另一种是各种版本的Windows使用的32位和64位指令集。 Linux操作系统。
即使芯片是相同的,并且可能以相同的模式运行,程序与主机操作系统交互以获得服务(例如输入/输出)的方式也大不相同。
除了最简单的程序外,其他所有程序都倾向于使用额外目标代码的外部库,它们提供常见操作(字符串操作,格式化输入和输出,数学,非平凡网络等)的帮助,这样它们就不会必须从头开始写。但是,可用的这些库的精确集合,以及重要的请求和与它们交互的方式,取决于主机操作系统。您可以使用您的应用程序打包库(静态链接),而不是使用.DLL / .so期望已经在系统上(动态链接),但是仍然需要满足请求底层原始操作系统服务的差异
此外,某些方案(如java和.net)会创建在虚拟机或模拟处理器上运行的对象代码,而不是直接在物理处理器上运行。如果虚拟机引擎和支持库以兼容的形式提供,则在某种程度上这些是可移植的。
objdump的mingw版本在windows上运行并处理windows可执行文件,并且是用于构建具有类似linux语义的Windows程序的工具套件的一部分。它还有一个跨版本,可以在linux上运行并处理windows文件。换句话说,WINE兼容层可以在linux上运行许多Windows可执行文件 - 你可以明确地测试它。但是如果你愿意用C语言编写posix接口(或者在程序集上使用很多包装器),那么你应该能够使用linux和cross或mingw版本的gnu工具构建一个代码库,这样您可以相对有效地为两个操作系统生成二进制文件。