gpt4 book ai didi

linux - 在 nasm 中指定起始地址?

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:21 26 4
gpt4 key购买 nike

考虑一个仅包含简单 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在输出文件中的给定绝对地址处找到一个部分通过组织。您可以根据需要多次使用此选项在命令行中找到多个部分。组织必须是单一的十六进制整数;为了与其他链接器兼容,您可以省略通常与十六进制值相关的前导 0x。注意:节名、节名之间不能有空格等号(“=”)和组织。”

来自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 到底有什么作用?

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

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

最佳答案

运行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 完全按照指令所述执行:origin。它的唯一功能是指定一个偏移量,该偏移量将添加到该部分内的所有内部地址引用中”

关于linux - 在 nasm 中指定起始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com