【问题标题】:Where are place address of globals, static and string literals by a compiler C?编译器 C 的全局、静态和字符串文字的位置地址在哪里?
【发布时间】:2014-04-12 15:50:55
【问题描述】:

首先我读到地址在 .data 和 .text 中保存字符串文字(加上我想的机器代码),之后在其他一些文章中有人说它已经改变并且更长的字符串文字存在于 .text 但 .rodata 而不是(它是true 我的 clang 编译器输出)。但是 .data 内容与我在 C 程序中 printf 的地址不匹配。

假设这个 C 程序:

static int a;
int main()
{
    printf("my address = %p\n", &a);
    return 0;
}

这个 C 程序的输出:

 $ ./a.out
my address = 0x804a01c

然后是.data部分的内容:

$ objdump -s -j .data a.out

a.out:     file format elf32-i386

Contents of section .data:
 804a00c 00000000 00000000 

此内容中没有0x804a01c。地址在哪里?

【问题讨论】:

    标签: c linux 32-bit elf


    【解决方案1】:

    首先我读到地址在 .data 和 .text 中保存字符串文字(我想加上机器代码),之后在其他一些文章中有人说它已更改并且不再存在于 .text 但 .rodata 中的字符串文字而不是

    由编译器决定将字符串文字放在哪里(不是机器码)。

    大多数现代编译器会将字符串文字放入.rodata 部分,该部分通常与.text.ctors 和其他只读部分一起链接到第一个PT_LOAD 部分。

    此内容中没有 0x804a01c。地址在哪里?

    .bss。如果您希望a 驻留在.data 中,则需要对其进行初始化。例如

    static int a = 42;
    

    例如,可以将字符串文字放入.rodata,并将其地址放入.data

    当然:

    cat t.c
    const char string_literal[] = "abcdefgh";       // in .rodata
    const char *p_string_literal = string_literal;  // in .data
    int main() { return 0; }
    
    gcc -m32 t.c
    readelf -x.rodata a.out
    
    Hex dump of section '.rodata':
      0x08048488 03000000 01000200 61626364 65666768 ........abcdefgh
      0x08048498 00
                                     .
    readelf -x.data a.out
    
    Hex dump of section '.data':
      0x0804a008 00000000 00000000 90840408          ............
    

    注意:string_literal 的地址——0x08048490.data 中拼写为“backwards”,因为x86 是little-endian

    【讨论】:

    • 我不想说它是机器码,但正如我读到的文章所说的那样,它存储在 .text 部分。
    • 例如,可以将字符串文字放入.rodata,并将其地址放入.data
    【解决方案2】:

    具有静态存储分配的变量,即静态和全局变量分配在数据段或bss段中,取决于它们是否被0初始化(bss段)或未初始化(数据段)。

    默认情况下,未初始化的静态数据总是0 初始化。因此,

    static int a;
    

    默认初始化为 0 并进入 bss 段。字符串字面量是只读数据,通常存储在文本段中。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2016-06-19
      相关资源
      最近更新 更多