为什么不同类型的符号占用相同的长度?

时间:2018-04-26 13:55:05

标签: c object-files nm

我在x64机器上用cygwin GCC编译了下面的代码:

gcc main.c -o main

(main.c中)

long long mango = 13; // I also tried `char`, `short`, `int`
long melon = 2001;

void main()
{

}

然后我使用nm转储符号值:

./main:0000000100402010 D mango
./main:0000000100402018 D melon

据我了解,符号的值仅表示其地址。因此mango的地址为100402010melon的地址为100402018。所以mango应该占用8个字节。

我尝试了mango的其他类型,例如charintshort。它总是占用8个字节。

为什么尺寸不会改变?

ADD 1

感谢评论。

我刚试过下面的代码:

typedef struct{
    char a1;
    char a2;
    char a3;
    char a4;
    char a5;
} MyStruct;

MyStruct MyObj1={1,2,3,4,5};

MyStruct MyObj2={1,2,3,4,5};

long long mango = 13;
long melon = 2001;

void main()
{

}

这次,nm向我展示了这一点:

./main:0000000100402020 D mango
./main:0000000100402028 D melon
./main:0000000100402010 D MyObj1
./main:0000000100402015 D MyObj2

MyObj1MyObj2分隔5个字节。因此,确定由编译器决定填充。

1 个答案:

答案 0 :(得分:2)

来自 GNU nm binary utilities: nm page

  

符号值,以选项(见下文)选择的基数,或   十六进制默认情况下。符号类型。至少以下类型   使用;其他也是,取决于目标文件格式。如果   小写,符号通常是本地的;如果是大写,则符号为   全球(外部)。然而,有一些小写符号   显示特殊全局符号(u,v和w)。根据{{​​1}}设置和默认对齐边界,连续符号地址之间的距离可能是该符号pragma的字节数的精确值,也可能包括 padding ,它会增加符号的 sizeof

type

IMO在A The symbol’s value is absolute, and will not be changed by further linking. B ... 用语中使用 value 这个词是不幸的,因为在这个上下文中, value 用于描述符号的地址。符号(值)的地址不会改变。但在正常的C语言中,符号的确实会发生变化,例如:

nm

关于地址的大小,64位构建的任何符号的地址总是具有8个字节的大小,而32位构建的任何符号的地址将具有4个字节的大小。这些大小不会更改,也不会为分配给它们的符号分配

关于各种符号之间在内存空间中的距离,此距离会受到符号的int i = 0; // the address for symbol i will remain constant i = 10; // but the value of the symbol i can change. ,以及 aligned 沿着实现边界的影响,并且,正如您所注意到的,编译器:“因此确定由编译器决定填充。”取决于type设置和默认对齐边界, {{3 }} 可能会导致连续符号的地址距离仅由pragmatype sizeof 值的组合引起的距离更大一个特定的符号。 (typeschar类型符号非常常见)。