elf-loader如何知道stderr和stdout的地址

How does elf-loader knows the address of stderr and stdout

我正在反汇编一个非常简单的 ELF 程序 (Linux x86)。
使用 IDA PRO 软件,我在 .bss 部分看到 stdoutstderr。 而且我还没有找到任何设置 stdoutstderr 值的东西。 它是如何工作的?
Сan stdoutstderr 为空?

So you mean stdout and stderr should always be at the same memory address in .bss

.bss 开始到 stdoutstderr 的偏移量是在静态 link 时间确定的。

.bss 的起始地址受 ASLR(堆放置随机化)影响。因此,对于给定的二进制文件,stdout 的地址可能会从 运行 运行.

how IDA pro knows this item in .bss is stdout or stderr

可以知道的唯一方法是通过符号table。您应该在以下位置的输出中看到它:

readelf -Ws ./a.out | egrep 'stdout|stderr'
nm ./a.out          | egrep 'stdout|stderr'
nm -D ./a.out       | egrep 'stdout|stderr'

更新:

but what happens if symbol table is stripped

有两种情况需要考虑:完全静态 link 和动态 link。

在全静态的情况下,所有对stderr的引用都可以被完全删除,IDA pro不会知道stderr在哪里。

在动态-linked 的情况下,有两个符号 tables:"regular" 一个(由 nm 显示)和动态一个(显示通过 nm -D)。 Strip 将仅删除 常规符号 table(因为删除动态符号 table 没有任何意义——executable 不会 运行 没有它)。然后,IDA pro 可以使用 stderr 的动态符号 table 条目来判断该符号的位置。