相关疑难解决方法(0)

为什么在x86_64 ABI中选择地址0x400000作为文本段的开头?

文件中.27它说文本段从0x400000开始.为什么选择这个特定的地址?有什么理由吗?相同的地址被选择在GNU ldLinux:

$ ld -verbose | grep -i text-segment
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的,因为这个地址在32位x86可执行文件中更大:

$ ld -verbose | grep -i text-segment
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
Run Code Online (Sandbox Code Playgroud)

我读了这个问题,讨论为什么为i386选择了0x080xxxxx地址,但它没有解释x86_64的变化.在这个问题上很难找到任何解释.有人有线索吗?

linux memory x86-64 elf abi

32
推荐指数
1
解决办法
2259
查看次数

为什么我的可执行文件中的入口点地址是0x8048330(0x330是.text部分的偏移量)

我写了一个小程序添加到整数和使用"readelf -a executable_name"它显示了elf标题中的入口点地址:

Entry point address: 0x8048330
Run Code Online (Sandbox Code Playgroud)

我的可执行文件如何事先知道这个地址,甚至在加载器加载到内存之前?elf_format.pdf表示该成员提供系统首先转移控制的虚拟地址,从而启动该过程.任何人都可以解释这句话的含义是什么,这里虚拟地址的含义是什么?

另请告诉我,可执行文件的值为0x8048330,作为入口点地址.只是为了交叉检查我编译了另一个程序,为此,入口点地址保持相同的值0x8048330(两种情况下.text部分的偏移量为0x330).

c linux x86 assembly elf

19
推荐指数
3
解决办法
8968
查看次数

C中的内存起始位置

我正在研究给定进程的内存布局.我注意到每个进程的起始内存位置不是0.在这个网站上,TEXT从0x08048000开始.一个原因可以是使用NULL指针区分地址.我只是想知道是否还有其他好的理由?谢谢.

c memory memory-layout

7
推荐指数
1
解决办法
1518
查看次数

objdump - 头部ELF - 旗帜的含义?

$ objdump -f ./a.out

./a.out:     file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x080484e0
Run Code Online (Sandbox Code Playgroud)

$ objdump -f function.o

function.o:     file format elf32-i386
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000
Run Code Online (Sandbox Code Playgroud)

flags(flags 0x00000011:OR标志0x00000112 :)是什么意思?ELF头文件中的Nothin具有此标志.e_flag包含0.

有人对他的意思有所了解吗?

谢谢

objdump

5
推荐指数
1
解决办法
5449
查看次数

objdump vs/proc/pid/maps的虚拟内存地址?

我正在尝试了解程序的可执行程序集在程序加载/运行时的确切位置.我发现有两个资源在讨论这个问题,但它们有点难以阅读:

所以,这是一个简短的例子; 我很感兴趣tail程序的可执行部分最终在哪里.基本上,objdump告诉我这个:

$ objdump -dj .text /usr/bin/tail | head -10

/usr/bin/tail:     file format elf32-i386
Disassembly of section .text:

08049100 <.text>:
 8049100:   31 ed                   xor    %ebp,%ebp
 8049102:   5e                      pop    %esi
 8049103:   89 e1                   mov    %esp,%ecx
...
Run Code Online (Sandbox Code Playgroud)

我假设我在这里看到了tail's' main()的调用,没有删除符号.无论如何,可执行部分的开头是,根据这个,0x08049100; 我对它最终到底的地方感兴趣.

然后,我tail在后台运行,得到它的pid:

$ /usr/bin/tail -f & echo $!
28803
Run Code Online (Sandbox Code Playgroud)

......我检查一下/proc/pid/maps:

$ cat /proc/28803/maps
00547000-006a8000 r-xp 00000000 08:05 3506       /lib/i386-linux-gnu/libc-2.13.so
...
008c6000-008c7000 r-xp 00000000 00:00 0 …
Run Code Online (Sandbox Code Playgroud)

c linux memory virtual-memory

3
推荐指数
1
解决办法
3933
查看次数

标签 统计

c ×3

linux ×3

memory ×3

elf ×2

abi ×1

assembly ×1

memory-layout ×1

objdump ×1

virtual-memory ×1

x86 ×1

x86-64 ×1