我可以告诉gcc/ld排除未使用的模块吗?

问题描述:

我想知道我是否可以告诉gcc/ld忽略未使用的模块放入输出文件。我可以告诉gcc/ld排除未使用的模块吗?

假设我有模块a.c,b.cc.ca.cb.c取决于对方,其中一个包含main(),并且由于任何原因,没有引用c.c的任何部分。

gcc -c a.c 
gcc -c b.c 
gcc -c c.c 

如果我捆绑在一起的东西到库,无论从c.c代码不会输出:

ar rcs abc.a a.o b.o c.o 
gcc abc.a 

但是,如果我直接给.o文件GCC,从代码c.c resp。包括c.o

gcc a.o b.o c.o 

我可以通过任何方式告诉gcc忽略未使用的模块而不将它们放入库中吗?

我正在编程一个AVRμC并使用AVR Studio,它不允许创建库,但希望省略未使用的源文件,具体取决于构建配置。

+1

如果您明确要求GCC添加c.o,您不应该对此感到惊讶:) – ydroneaud 2012-02-24 14:38:53

+0

那不是我,那是AVR Studio询问它的原因:-) – glglgl 2012-02-24 14:53:10

我不知道在AVR上是否有可能,但你可以要求GCC在编译时使用-ffunction-sections -fdata-sections将每个符号放在它自己的部分。然后在链接步骤中,您可以使用-Wl,--gc-sections请求ld删除未使用的部分。

+0

听起来不错。我刚刚找到了一个开关,可以启用这个“gc-sections”。它是否也在没有'-ffunction-sections -fdata-sections'的每个模块的基础上工作?我不想让ISR程序被抛出...... – glglgl 2012-02-24 14:54:19

+0

@glglgl根据它的名字,它只是每个部分,而不是每个模块。所以如果你的ISR没有被其他代码中的任何东西引用,它将被链接器丢弃。 – ydroneaud 2012-02-24 14:56:49

+0

哦,我认为每个模块都有一些自己的部分被丢弃,然后......经过一些测试后,事实证明这确实是这种情况。 – glglgl 2012-02-24 15:10:01