繁体   English   中英

链接静态库时,目标代码如何复制到可执行文件中?

[英]How is object code copied into executable when linking against static library?

我正在阅读 O'Reilly 的书21st Century C ,其中作者指出在链接静态库时:

编译器 [有效地] 将库的相关内容复制到最终的可执行文件中。

我试图通过创建我自己的由这个模块组成的静态库来测试这个:

static char szStr[64];

char* single_func() {
    strcpy(szStr, "Hello string!\r\n");
    return szStr;
}

void func0() {
    strcpy(szStr, "Hello");
}

char* func1() {
    strcat(szStr, " string!\r\n");
    return szStr;
}

为了测试,我创建了两个 C 文件,其中一个调用single_func() ,另一个调用func0()func1()

在这两种情况下,生成的可执行文件都是 751290B。 如果我直接从模块调用strcpystrcat ,两个可执行文件最终都是 7215B。

这是否与上述声明冲突,或者我是否遗漏了有关链接的一些细节?

一个相关的问题是静态库是1600B,那么这个大小的增加从何而来?


额外的:

两个主文件仅由调用函数和打印结果组成,如下所示:

主要0:

#include <stdio.h>
#include "sharedlib.h"
int main() {
    char* szStr = single_func();
    printf("%s", szStr);
    return 0;
}

主要1:

#include <stdio.h>
#include "sharedlib.h"
int main() {
    char* szStr;
    func0();
    szStr = func1();
    printf("%s", szStr);
    return 0;
}

文件是这样编译的:

gcc -static main0.c -L. -lsharedlib -o main0

平台为linux,编译器为gcc v4.6.3。

对于静态库,复制的单位是库中的目标文件。 由于您的两个程序都从目标文件中调用了一个函数,因此两个程序最终都具有可执行文件中的所有目标文件,因此大小相同(给出或采用调用main()程序的大小)。

可执行文件中的额外信息可能来自多个地方。 其中一些将是控制和调试信息。 如果您也静态链接,其中一些可能来自 C 库。 我们可能需要查看主程序和链接行,并了解平台提出通胀的其他原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM