【发布时间】:2013-02-20 21:53:06
【问题描述】:
考虑一个只有简单的 32 位 x86 汇编语句的文件:
call 0xc1066580
如果我用 nasm -f elf 组装这个文件,我会得到:
0: e8 7c 65 06 c1 call 0xc1066581
如果我使用 GCC 并指定 -Ttext=0 和 -nostdlib,我会得到:
0: e8 7b 65 06 c1 call c1066580
-nostdlib 链接时不要使用标准的系统启动文件或库。没有启动文件,只有您指定的库被传递给链接器,并且指定系统库链接的选项(例如 -static-libgcc 或 -shared-libgcc)被忽略。
但是 -Ttext=0 究竟是做什么的呢?我用它来指定 EIP 在加载/执行时开始的入口地址。我无法在手册页中找到 -Ttext,当我在线搜索时发现:
"-Ttext 是"--section-start=text" 的别名,读作: --section-start=sectionname=org 在给定的绝对地址处找到输出文件中的一个部分 通过组织。您可以根据需要多次使用此选项 在命令行中找到多个部分。 org 必须是单一的 十六进制整数;为了与其他链接器兼容,您可以 省略通常与十六进制值相关的前导 0x。 注意:sectionname 之间不能有空格, 等号 ("=") 和 org."
但是,我也没有在我的手册页中找到 --section 或 sectionname,当我尝试用 --section-name 替换 -Ttext 时,我发现这是一个无法识别的参数(如果这是 GCC 4.7.2这是相关的)。
有人能告诉我这个(-Ttext 的)解释是否准确,我可以在我的手册中找到它吗?如果不准确,-Ttext 到底有什么作用?
我的另一个问题是:如何将与 -Ttext 类似的参数指定给 nasm?或者换句话说,我需要做什么才能使 nasm 产生与 gcc 相同的输出?
我尝试在 64 位和 32 位系统上执行相同的汇编语句(使用 nasm 和 gcc),得到相同的结果。
【问题讨论】:
标签: linux gcc assembly x86 nasm