gpt4 book ai didi

c - 字符串文字的编译输出中的 .rodata 和 .rodata.str1.4 部分有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 17:23:01 35 4
gpt4 key购买 nike

例如当我有:

const char mesg [] = "Hello World";

它直接放在 .rodata 但是当我有:

const char* mesg = "Hello World";

直接放在.rodata.str1.4

它们有什么区别,为什么我们在使用指针时使用.rodata.str1.4?

最佳答案

我做了几个实验,看起来编译器将字符串放在目标文件的特殊部分中。编译二进制文件时发生了有趣的事情,字符串按预期以 .rodata 结尾。进一步的实验表明,如果你在不同的对象中有相同的字符串,它们会在生成的二进制文件中统一为相同的字符串。

所以我怀疑这样做的原因是编译器想给链接器一些关于只读数据的信息而不是“它是只读的”,以便最终链接可以做出更明智的决定如何处理它,包括重复数据删除。

$ cat foo.c
const char *
fun(int i)
{
const char *foo = "foofoo foo foo foo";
const char *bar = "barbar bar bar bar";
return i ? foo : bar;
}
$ cat bar.c
#include <stdio.h>
extern const char *fun(int);

int
main(int argc, char **argv)
{
const char *foo = "foofoo foo foo foo";

printf("%s%s\n", foo, fun(1));
return 0;
}
$ cc -c -O2 foo.c
$ cc -c -O2 bar.c
$ objdump -s foo.o
[...]
Contents of section .rodata.str1.1:
0000 62617262 61722062 61722062 61722062 barbar bar bar b
0010 61720066 6f6f666f 6f20666f 6f20666f ar.foofoo foo fo
0020 6f20666f 6f00 o foo.
[...]
$ objdump -s bar.o
[...]
Contents of section .rodata.str1.1:
0000 666f6f66 6f6f2066 6f6f2066 6f6f2066 foofoo foo foo f
0010 6f6f0025 7325730a 00 oo.%s%s..
[...]
$ cc -o foobar foo.o bar.o
$ objdump -s foobar
[...]
Contents of section .rodata:
400608 01000200 00000000 00000000 00000000 ................
400618 62617262 61722062 61722062 61722062 barbar bar bar b
400628 61720066 6f6f666f 6f20666f 6f20666f ar.foofoo foo fo
400638 6f20666f 6f002573 25730a00 o foo.%s%s..
[...]

关于c - 字符串文字的编译输出中的 .rodata 和 .rodata.str1.4 部分有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14254889/

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