在nasm中指定起始地址?

时间:2013-02-20 21:53:06

标签: linux gcc assembly x86 nasm

考虑一个只有简单的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之间应该没有空格 等号(“=”)和组织。“

来自http://www.linuxquestions.org/questions/linux-general-1/gcc-creating-a-huge-executable-image-redhat-2-6-18-8-el5-x86_64-linux-759302/

但是,我在我的联机帮助页中也找不到--section或sectionname,当我尝试用-section-name替换-Ttext时,我得到的是这是一个无法识别的参数(如果是GCC 4.7.2,那么这是相关的。)

有人可以告诉我这个(-Ttext)的解释是否准确以及我可以在手册中找到它?如果它不准确,-Ttext真的会做什么?

我的另一个问题是:如何将一个类似的参数指定为-Ttext to nasm?或者换句话说,我需要做些什么来使nasm产生与gcc相同的输出?

我尝试在64位和32位系统上执行相同的汇编语句(使用nasm和gcc),我得到相同的结果。

1 个答案:

答案 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。它的唯一功能是指定一个偏移量,它被添加到“

部分中的所有内部地址引用