考虑一个只有简单的 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 给出的绝对地址处找到一个节。您可以使用此选项在命令行中定位多个部分所需的次数。org 必须是单个十六进制整数;为了与其他链接器兼容,您可以省略通常与十六进制值相关联的前导 0x。注意:sectionname 之间不应有空格、等号 ("=") 和 org."
但是,我也没有在我的手册页中找到 --section 或 sectionname,当我尝试用 --section-name 替换 -Ttext 时,我发现这是一个无法识别的参数(如果相关,这是 GCC 4.7.2 )。
有人能告诉我这个解释(-Ttext)是否准确,我可以在我的手册中找到它吗?如果它不准确,那么 -Ttext 究竟做了什么?
我的另一个问题是:如何将与 -Ttext 类似的参数指定为 nasm?或者换句话说,我需要做什么才能使 nasm 产生与 gcc 相同的输出?
我尝试在 64 位和 32 位系统上执行相同的汇编语句(使用 nasm 和 gcc),得到相同的结果。