考虑一个只有简单的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启动= sectionname =组织 在给定的绝对地址处找到输出文件中的一个部分 通过组织。您可以根据需要多次使用此选项 在命令行中找到多个部分。组织必须是单一的 十六进制整数;为了与其他连接器兼容,您可以 省略通常与十六进制值相关联的前导0x。 注意:sectionname之间应该没有空格 等号(“=”)和组织。“
但是,我在我的联机帮助页中也找不到--section或sectionname,当我尝试用-section-name替换-Ttext时,我得到的是这是一个无法识别的参数(如果是GCC 4.7.2,那么这是相关的。)
有人可以告诉我这个(-Ttext)的解释是否准确以及我可以在手册中找到它?如果它不准确,-Ttext真的会做什么?
我的另一个问题是:如何将一个类似的参数指定为-Ttext to nasm?或者换句话说,我需要做些什么来使nasm产生与gcc相同的输出?
我尝试在64位和32位系统上执行相同的汇编语句(使用nasm和gcc),我得到相同的结果。
答案 0 :(得分:0)
正在运行ld --help
-Ttext ADDRESS Set address of .text section
如果我们使用gcc -Ttext=8 -nostdlib -o test test.s
.globl _start
_start:
movl test,%ebx
test:
转储节标题(objdump -h test
):
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000007 0000000000000008 0000000000000008 00200008 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
..和代码(objdump -d test
):
0000000000000008 <_start>:
8: 8b 1c 25 0f 00 00 00 mov 0xf,%ebx
我们可以看到.text
部分的起始地址为8,大小为7.也就是说,对部分中符号的所有引用都已被我们指定的起始地址(8)偏移,但是没有填充(由于更改了地址,部分大小没有增长)。
你应该能够通过使用ORG directive来完成同样的事情:“NASM的ORG完全符合指令所说的:origin。它的唯一功能是指定一个偏移量,它被添加到“。
部分中的所有内部地址引用