0

考虑一个只有简单的 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."

来自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 类似的参数指定为 nasm?或者换句话说,我需要做什么才能使 nasm 产生与 gcc 相同的输出?

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

4

1 回答 1

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 指令来完成与 NASM 相同的事情:“NASM 的 ORG 完全按照指令所说的:起源。它的唯一功能是指定一个偏移量,该偏移量将添加到该部分内的所有内部地址引用中”

于 2013-03-05T16:17:21.217 回答