Macos 将源提取到静态库会增加大小

Macos 将源提取到静态库会增加大小,macos,linker,static-libraries,llvm-clang,code-size,Macos,Linker,Static Libraries,Llvm Clang,Code Size,我刚刚将一些源代码提取到几个静态库中,以使项目更加结构化,并且主可执行文件的二进制大小增加了约150kb。这让我很困惑,所以我用三个文件做了一个小项目: foo.c: int foo1(void) { return 1; } int foo2(void) { return 2; } ... int foo100(void) { return 3; } bar.c: int bar1(void) { return 1; } int bar2(void) { return 2; } ... in

我刚刚将一些源代码提取到几个静态库中,以使项目更加结构化,并且主可执行文件的二进制大小增加了约150kb。这让我很困惑,所以我用三个文件做了一个小项目:

foo.c:
int foo1(void) { return 1; }
int foo2(void) { return 2; }
...
int foo100(void) { return 3; }


bar.c:
int bar1(void) { return 1; }
int bar2(void) { return 2; }
...
int bar100(void) { return 4; }


main.c:
int main(int argc, const char * argv[]) {
  int acc = 0;
  acc += foo1();
  acc += bar1();
  acc += foo2();
  acc += bar2();
  ...
  acc += foo100();
  acc += bar100();
  printf("%d\n", acc);
}
在我制作了两个可执行文件和一个静态库之后:

libfoo.a:
  foo.o
  bar.o

test_no_lib:
  main.o
  foo.o
  bar.o

test_with_lib:
  main.o
  libfoo.a
它们的大小相差约2kb(
测试无库
约31kb,
测试有库
约33kb,在macos上使用clang 11编译,-Os优化,所有符号都被去除)


为什么呢?难道静态库不应该只是一个对象文件的存档,链接器会在需要时获取这些对象文件吗?为什么它也会增大尺寸?虽然不是很多,但我还是很惊讶,为什么它不是免费的?

我已经弄明白了。静态库是使用不同的可见性设置(默认)编译的,所以链接器必须保留重新定位信息,即使所有符号名称都已删除