【问题标题】:Specify start address in nasm?在 nasm 中指定起始地址?
【发布时间】: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."

来自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),得到相同的结果。

【问题讨论】:

    标签: linux gcc assembly x86 nasm


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-24
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2011-01-04
      相关资源
      最近更新 更多