标签: elf

使用户空间文本段从 0x8048000 开始的基本原理

我在某处读到(至少从 Linux v. 2.6 开始)所有用户空间代码都放置在虚拟内存地址空间中的加载地址 0x8048000 处。

我自己的观察证实了这一点。我做了一个

cat /proc/......../maps
Run Code Online (Sandbox Code Playgroud)

对于多个进程,进程'程序的第一部分text总是从'0x8048000'开始。

此外,C 库启动代码和所有其他运行时好东西似乎都映射在此默认值之后。

这构成了近 128 M 的地址空间,考虑到 0xC0000000 - 0x8048000 仍然是用户空间内容的几乎 3G 地址空间,这并不多。

所以我的问题是为什么?

我们正在处理虚拟地址,与其他程序的干扰或重叠是由 VM 工作方式的定义排除的。

0x00000000 到 0x8048000 范围内是否有一些固定/默认映射?

除了默认起始地址落在页面边界这一事实之外,选择这个数字而不是任何其他值的理由是什么?

linux process memory elf virtual-memory

5
推荐指数
0
解决办法
1310
查看次数

文件头的部分

我正在研究我的 C 程序,我是 Linux/UNIX 开发的新手,正在四处看看。

我创建了一个简单的 Hello world C 程序,并正在检查编译过程。

我试图读取最终可执行文件的文件头并得到输出如下

$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**
Run Code Online (Sandbox Code Playgroud)

我了解 elf32-i386 部分,但我不太确定标题的其他部分。

D_PAGED与需求分页有某种关系吗?是什么 EXEC_P, HAS_SYSMS意思?是起始地址,程序的逻辑地址main()

c executable elf

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

为什么 chroot 在现有文件上得到 ENOENT?

;TL-DR -答案:因为缺少动态链接器 ld-linux-x86-64.so.2。

\n\n

我已经-ro,loop/mnt/foo.

\n\n

它包含以下内容(/mnt/foo是挂载点):

\n\n
\n-rwxr-xr-x 1 root root 110088 jan 17 2013 /mnt/foo/bin/ls\n-rw-r--r-- 1 root root 5212 jul 23 09:35 /mnt/foo/etc/ ld.so.cache\n-rw-r--r-- 1 个根 root 7 月 23 日 5 日 09:35 /mnt/foo/etc/ld.so.conf\n-rw-r--r-- 1 个根根 31168 maj 23 2013 /mnt/foo/lib/libacl.so.1\n-rw-r--r-- 1 root 根 18624 maj 20 2013 /mnt/foo/lib/libattr.so.1\n- rwxr-xr-x 1 根 1853400 okt 12 2013 /mnt/foo/lib/libc.so.6\n-rw-r--r-- 1 根 14664 okt 12 2013 /mnt/foo/lib/libdl .so.2\n-rw-r--r-- 1根根256224 mar 11 2013 …

linux chroot dynamic-linking elf exec

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

读取ELF文件的程序头内容

如何从 ELF 文件中单独提取可加载程序头?通过使用 readelf 检查二进制文件,可以获得类似于以下内容的输出:

$ readelf -l helloworld

Elf file type is EXEC (Executable file)
Entry point 0x400440
There are 9 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8  R E    8
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001c 0x000000000000001c  R      1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000000070c 0x000000000000070c  R E    200000
  LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
                 0x0000000000000230 0x0000000000000238  RW     200000
  DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e28 …
Run Code Online (Sandbox Code Playgroud)

linux c ubuntu debian elf

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

为什么我不能在 Linux 上执行 Android x86 可执行文件

我正在尝试将 Android 应用程序移植到 Linux(不要笑:),但我遇到了一个问题。app_process在添加可执行权限后尝试执行 Android 可执行文件 ( )./app_process时表示它不存在,但cat ./app_process有效。

同样在我的文件管理器(Pantheon Files)中,可执行文件显示了共享库图标。

有什么方法可以让这些在 Linux 上执行。

linux executable android elf shared-library

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

.text 部分是否在加载的 ELF 可执行文件之间共享?

例如grep,如果一个程序当前正在运行,而用户执行另一个实例,那么这两个实例是否共享.text它们之间的只读部分以节省内存?主要可执行文本的共享是否与共享库类似?

这种行为是否在 Linux 中表现出来?如果是这样,其他Unices 也这样做吗?

如果这不是在 Linux 中完成的,那么实现通常作为共享库并行运行多个实例的可执行文件是否有任何好处,调用的可执行文件只需调用库中的主函数?

kernel executable elf virtual-memory dynamic-loading

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

readelf 和 eu-readelf 有什么区别?

您可以从以下位置获得 eu-readelf:

$ sudo apt-get install elfutils

我只是想知道为什么你会使用一个而不是另一个?

elf

4
推荐指数
1
解决办法
2730
查看次数

快速区分 ELFves 和脚本

如何file尽快区分 ELFves 和脚本?

我不需要任何进一步的细节,只需要ELFscript ( /plaintext ) 或other/error

scripting executable elf files

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

objdump 如何反汇编 elf 二进制文件

我有一个快速的问题。我使用以下代码从 ac 代码生成了一个 ELF 二进制文件:

gcc -o simple simple.c
Run Code Online (Sandbox Code Playgroud)

然后我为那个 ELF 二进制文件做 objdump:

objdump --disassemble-all simple
Run Code Online (Sandbox Code Playgroud)

我已经检查了我的目录ls -a,那里没有 .o 文件。我的问题仍然是如何objdump向我展示完整的反汇编代码?是否objdump在二进制文件中进行静态分析以覆盖所有代码?

elf reverse-engineering

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

为什么 objdump -T 中相同版本字符串的某些实例包含在括号中?

查看运行objdump -Ton生成的以下输出片段libc.so.6

000000000009f8a0 g    DF .text  000000000000001d (GLIBC_2.2.5) aio_write64
0000000000119d00 g    DF .text  0000000000000034  GLIBC_PRIVATE __pread64_nocancel
000000000009aae0 g    DF .text  00000000000003c0  GLIBC_2.34  pthread_rwlock_timedwrlock
0000000000133db0 g    DF .text  0000000000000354  GLIBC_2.2.5 __backtrace_symbols
00000000001184f0  w   DF .text  00000000000006c2  GLIBC_2.23  fts64_read
000000000009aae0 g    DF .text  00000000000003c0 (GLIBC_2.2.5) pthread_rwlock_timedwrlock
Run Code Online (Sandbox Code Playgroud)

输出的第 1 行和第 4 行具有相同的GLIBC版本字符串,但其中一个包含在括号中,而另一行则没有。我在objdump许多其他elf二进制文件的输出中观察到了这种差异。(GLIBC_2.2.5)GLIBC_2.2.5输出之间有什么细微的区别吗objdump

linux elf binary

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