首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在与gcc静态链接时,如何仅包含已使用的符号?

在与GCC静态链接时,如果你想仅包含已使用的符号,可以使用GCC的-ffunction-sections-fdata-sections选项。这些选项会为每个函数和数据对象分配单独的节(section),从而使链接器能够仅包含实际使用的符号。

要使用这些选项,请在编译时添加它们,然后在链接时使用-Wl,--gc-sections选项。例如:

代码语言:bash
复制
gcc -c -ffunction-sections -fdata-sections file1.c -o file1.o
gcc -c -ffunction-sections -fdata-sections file2.c -o file2.o
gcc -Wl,--gc-sections file1.o file2.o -o output

这将仅包含在编译和链接过程中实际使用的符号,从而减小生成的可执行文件的大小。

注意:这种方法可能会导致一些静态库中的符号被忽略,因为链接器可能无法确定它们是否被使用。在这种情况下,你可能需要手动指定这些符号。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用 SpringMVC ,Spring 容器是如何 Servlet 容器进行交互

最近都在看小马哥 Spring 视频教程,通过这个视频去系统梳理一下 Spring 相关知识点,就在一个晚上,躺床上看着视频快睡着时候,突然想到当我们使用 SpringMVC ,Spring...容器是如何 Servlet 容器进行交互?...虽然博客上还有几年前写一些 SpringMVC 相关源码分析,其中关于 Spring 容器如何 Servlet 容器进行交互并没有交代清楚,于是趁着这个机会,再撸一次 SpringMVC 源码...Tomcat 启动,根据这两段配置,究竟做了什么动作,使得 Tomcat Spring 完美地结合在一起了呢?...将 Spring 容器初始化最后以一个元素形式保存到 Servlet 容器之后,那么 SpringMVC 初始化时,是如何拿到 Spring 容器呢?

2.6K20

Linux 程序编译过程来龙去脉

静态库和动态库不同点在于代码被载入时刻不同。静态代码在编译过程中已经被载入可执行程序,因此体积较大。共享库代码是可执行程序运行时才载入内存,在编译过程中简单引用,因此代码体积较小。...C语言类似,C++也定义了自己标准,同时提供相关支持库,称为C++运行时库。 准备工作 由于GCC工具链主要是Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...Linux系统中,gcc编译链接动态库搜索路径顺序通常为:首先从gcc命令参数-L指定路径寻找;再从环境变量LIBRARY_PATH指定路径寻址;再从默认路径/lib、/usr/lib、/...由于链接动态库和静态路径可能有重合,所以如果在路径中有同名静态库文件和动态库文件,比如libtest.a和libtest.so,gcc链接默认优先选择动态库,会链接libtest.so,如果要让....data:初始化C程序全局变量和静态局部变量。 .bss:未初始化C程序全局变量和静态局部变量。 .debug:调试符号表,调试器用此段信息帮助调试。 ?

2.9K30

Linux 程序编译过程详解

静态库和动态库不同点在于代码被载入时刻不同。静态代码在编译过程中已经被载入可执行程序,因此体积较大。共享库代码是可执行程序运行时才载入内存,在编译过程中简单引用,因此代码体积较小。...C语言类似,C++也定义了自己标准,同时提供相关支持库,称为C++运行时库。准备工作由于GCC工具链主要是Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...Linux系统中,gcc编译链接动态库搜索路径顺序通常为:首先从gcc命令参数-L指定路径寻找;再从环境变量LIBRARY_PATH指定路径寻址;再从默认路径/lib、/usr/lib、/...由于链接动态库和静态路径可能有重合,所以如果在路径中有同名静态库文件和动态库文件,比如libtest.a和libtest.so,gcc链接默认优先选择动态库,会链接libtest.so,如果要让...data:初始化C程序全局变量和静态局部变量。.bss:未初始化C程序全局变量和静态局部变量。.debug:调试符号表,调试器用此段信息帮助调试。

1.8K30

Linux 程序编译过程详解

静态库和动态库不同点在于代码被载入时刻不同。静态代码在编译过程中已经被载入可执行程序,因此体积较大。共享库代码是可执行程序运行时才载入内存,在编译过程中简单引用,因此代码体积较小。...C语言类似,C++也定义了自己标准,同时提供相关支持库,称为C++运行时库。 准备工作 由于GCC工具链主要是Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...Linux系统中,gcc编译链接动态库搜索路径顺序通常为:首先从gcc命令参数-L指定路径寻找;再从环境变量LIBRARY_PATH指定路径寻址;再从默认路径/lib、/usr/lib、/...由于链接动态库和静态路径可能有重合,所以如果在路径中有同名静态库文件和动态库文件,比如libtest.a和libtest.so,gcc链接默认优先选择动态库,会链接libtest.so,如果要让....data:初始化C程序全局变量和静态局部变量。 .bss:未初始化C程序全局变量和静态局部变量。 .debug:调试符号表,调试器用此段信息帮助调试。

1.8K30

gcc命令使用_c调用cmd并执行命令

处理#include 预编译指令,将被包含文件插入到该预编译指令位置。 删除所有注释“//”和“/* */”。 添加行号和文件标识,以便编译产生调试用行号及编译错误警告行号。...将编译生成 hello.s 文件汇编生成目标文件 hello.o GCC 选项-c 使 GCC 执行完汇编后停止,生成目标文件 链接 静态链接静态链接是指在编译阶段直接把静态库加入到可执行文件中去....data:初始化 C 程序全局变量和静态局部变量。 .bss:未初始化 C 程序全局变量和静态局部变量。 .debug:调试符号表,调试器用此段信息帮助调试。...汇编 gcc -c test.s -o test.o 链接 gcc 连接器是 gas 提供,负责将程序目标文件所需所有附加目标文件连接起来,最终生 成可执行文件。...GCC 产生尽可能多警告信息 总结 静态链接搜索路径顺序: ld 会去找 GCC 命令中参数-L 再找 gcc 环境变量 LIBRARY_PATH 再找内定目录 /lib /usr/lib

1.7K40

linux动态库和静态

;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖.so文件;gcc/g++库相关参数-L,-l,-fPIC,-shared;静态链接搜索过程;动态库链接...四、静态库和动态链接库同时存在gcc/g++默认链接是动态库: 当一个库同时存在静态库和动态库,比如libmysqlclient.a和libmysqlclient.so同时存在:...Linux下,动态库和静态库同事存在gcc/g++链接程序,默认链接动态库。...一、静态库解析符号引用: 链接器ld是如何使用静态库来解析引用符号解析阶段,链接器从左至右,依次扫描可重定位目标文件(*.o)和静态库(*.a)。...2、如果f是一个静态库(.a),那么链接器将尝试匹配U中未解析符号静态库成员(静态成员就是.o文件)定义符号

12.3K20

深入理解计算机系统(第三版) CSAPP 杂谈,第7章:链接

一般 ELF 包含以下几种 section: .text:可执行机器码 .rodata:只读数据,如字符串常量和 switch 跳转表 .data:初始化全局和静态变量 :bss:未初始化或初始化为....symtab:符号表,存放定义和引用函数全局变量信息。使用 STRIP 命令可以去掉符号表。 .rel.text:.text 中位置列表,是重定位信息。...弱全局符号分配在 COMMON section 中,强全局符号分配在 .bss 中。 静态库用于共享重复代码,链接会拷贝需要函数。也可以通过参数拷贝所有函数。...gcc 静态链接是按顺序进行。...遇到目标文件 .o 时会把未定义和已定义符号保存起来,遇到存档文件 .a ,除了前面的操作,还会把 .a 成员符号未定义符号比较,把匹配成员符号对应 .o 链接起来。

99530

C语言头文件j解析

如果所包含头文件非常庞大,则会严重降低编译速度(使用GCC-E选项可获得并查看最终预处理完文件)。因此,源文件中应包含必需头文件,且尽量不要在头文件中包含其它头文件。...3)头文件应包含哪些头文件取决于自身,而非包含该头文件源文件。 例如,编译源文件需要用到头文件B,且源文件包含头文件A,而索性将头文件B包含在头文件A中,这是错误做法。...但随着gcc 3.4发布,#pragma once中一些问题(主要与符号链接和硬链接有关)得以解决,#pragma once命令也标记为“未废弃”。...函数和定义初始化全局变量是强符号;未初始化全局变量是弱符号。Unix链接使用以下规则来处理多重定义符号: 规则一:不允许有多个强符号。...最坏情况下,编译链接正常,但不同文件对同名全局变量读写相互影响,引发非常诡异问题。这种风险使用无法接触源码第三方库尤为突出。 因此,应尽量避免使用全局变量。

1.9K88

C语言头文件组织包含原则

源文件编译,连同被包含进来头文件内容一起编译,生成目标文件(.obj)。 如果所包含头文件非常庞大,则会严重降低编译速度(使用GCC-E选项可获得并查看最终预处理完文件)。...因此,源文件中应包含必需头文件,且尽量不要在头文件中包含其它头文件。 二、 头文件组织原则 源文件中实现变量、函数定义,并指定链接范围。...但随着gcc 3.4发布,#pragma once中一些问题(主要与符号链接和硬链接有关)得以解决,#pragma once命令也标记为“未废弃”。...函数和定义初始化全局变量是强符号;未初始化全局变量是弱符号。Unix链接使用以下规则来处理多重定义符号: 规则一:不允许有多个强符号。...最坏情况下,编译链接正常,但不同文件对同名全局变量读写相互影响,引发非常诡异问题。这种风险使用无法接触源码第三方库尤为突出。 因此,应尽量避免使用全局变量。

4.9K32

程序一定要从main函数开始运行吗?

对于静态链接先提出两个问题: Q: 每个目标文件都有好多个段,目标文件在被链接成可执行文件,输入目标文件中各个段如何被合并到输出文件?...Tips: 现在程序和库通常来讲都很大,一个目标文件可能包含成百上千个函数或变量,当需要用到某个目标文件任意一个函数或变量,就需要把它整个目标文件都链接进来,也就是说那些没有用到函数也会被链接进去...如何指定程序入口 ld链接过程中使用-e参数可以指定程序入口,由于一段简短printf函数其实都依赖了好多个链接库,我们也不太方便使用链接脚本将目标文件所有这些依赖库进行链接,所以使用下面这段内嵌汇编程序来打印一段字符串.../test hello 如何使用自定义链接脚本实现自定义段功能 ld链接过程中使用-T参数可以指定链接脚本,通过ld -verbose可以查看默认链接脚本,原文太长,这里简单截取了一部分: $...B:该符号值出现在.bss段中,未初始化全局和静态变量。 C:该符号COMMON段中,里面的都是弱符号。 D:该符号位于数据段中。

1.2K30

【Linux】Linux 编译器调试器 -- gccg++gdb 使用

文章目录 一、Linux编译器 - gcc/g++ 使用 1、程序运行四个阶段 1.1 预处理 1.2 编译 1.3 汇编 1.4 链接 2、链接方式函数库 2.1 动态链接静态链接 2.2...如上,汇编得到二进制目标文件使用一般文本编辑器打开是一堆我们看不懂符号 (符号编码有关 – utf-8),我们可以使用 od 指令以指定格式来打开它 (默认是以八进制打开)。...(符号重定位);所以,链接本质是我们调用库函数如何标准库相关联问题。...,这样可以节省系统开销,Linux下其后缀名为 “.so”,Windows下其后缀名为 “.dll”; 注:动态链接必须使用动态库,静态链接必须使用静态库;即进行动态链接只能跳转到动态库中对应函数实现处...---- 3、gcc/g++ 使用 其实上面在学习预处理、编译、汇编、链接我们就已经使用 gcc/g++ 了,只是比较零散,下面我们来系统学习一下 gcc/g++。

1.5K00

动态库静态库优缺点比较分析_c静态库和动态库区别

我们使用时只需要包含相应头文件就可以使用(非静态编译还要有相应库文件)。而不用关心printf函数具体是如何实现,这样就大大提高了程序员编写代码效率。...静态链接方法: gcc –o staticcode –L....–lshared main.c(默认库在当前文件夹) 当程序静态库连接,库中目标文件所含所有将被程序使用函数机器码被copy到最终可执行文件中。...4.库文件是如何产生linux下 静态后缀是.a,它产生分两步 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元符号表 Step 2.ar命令将很多.o转换成.a,成文静态库...ranlib libapue.a 用nm程序显示存档文件索引,它可以显示目标文件符号 nm libapue.a | more 如果是显示目标文件符号: nm error.o | more 如何使用

3.1K20

【C语言】编译和链接深度剖析

Linux 环境下C语言编译器:gcc,本文将使用gcc作为演示工具进行每一个环节解析。...这个过程是递归进行,也就是被包含头文件也可能包含其他文件。 删除所有注释 添加行号和文件名标识,方便后续编译器生成调试信息等。 或保留所有的#pragma编译器指令,编译器后续会使用。...链接命令如下: gcc test .o -o test 链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。链接解决是一个项目中多文件,多模块之间互相调用问题。...符号包含链接符号最终地址信息。 总结: C语言链接过程中,通过构建全局符号表实现符号决议,通过读取和修改重定位表实现符号地址计算和重定位,从而生成可以直接执行目标文件。...这个时候程序讲使用一个运行时堆栈(stack),存储函数局部变量和返回地址。程序同时也可以使用静态(static)内存,存储静态内存中变量程序整个执行过程一直保留他们值。 终止程序。

8710

gcc编译器参数_gcc for c4droid

——————————————————————————– 第4步:程序中使用静态库; 静态库制作完了,如何使用它内部函数呢?...只需要在使用到这些公用函数源程序中包含这些公用函数原型声明,然后在用gcc命令生成目标文件指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。...程序3:main.c中,我们包含静态头文件hello.h,然后主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。...,也是使用到这些公用函数源程序中包含这些公用函数原型声明,然后在用gcc命令生成目标文件指明动态库名进行编译。...这也进一步说明了动态库程序运行时是需要。 我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用gcc命令完全一样,那当静态库和动态库同名gcc命令会使用哪个库文件呢?

91030

Linux:常用软件、工具和周边知识介绍

输入注释符号 //(或其他符号),然后按下 Esc 键退出插入模式。 批量去注释: 按下 Ctrl + v 进入可视块模式。 使用 hjkl 键选择注释区域。...连接器工作包括符号解析、重定位、链接加载等。 最终生成可执行文件或共享库包含了所有必要代码和数据,可以操作系统上运行。...静态库(Static Library): 定义:静态库是一组编译目标文件(通常以.a为后缀),其中包含了函数和数据,可以被多个程序使用。...使用方法:在编译,通过链接器将静态目标文件链接成一个可执行文件。 2....使用方法:在编译,通过链接器将动态库目标文件链接成一个可执行文件,并在程序运行时由动态链接器动态加载。 Linux里,gcc默认是进行动态链接使用动态库。

15510

【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

进行动态链接实际上也使用静态链接来实现 ),一个是DLL文件,引入库文件包含被DLL导出函数名称和位置,DLL包含实际函数和数据,应用程序使用LIB文件链接到所需要使用DLL文件,库中函数和数据并不复制到可执行文件中...动态库程序编译并不会被链接到目标代码中,而是程序运行是才被载入,因此程序运行时还需要动态库存在。本节主要通过举例来说明如何在Linux中创建静态库和动态库,以及使用它们。...step4:程序中使用静态静态库制作完了,如何使用它内部函数呢?...只需要在使用到这些公用函数源程序中包含这些公用函数原型声明,然后在用gcc命令生成目标文件指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。...这也进一步说明了动态库程序运行时是需要。 我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用gcc命令完全一样,那当静态库和动态库同名gcc命令会使用哪个库文件呢?

3.8K52

编译连接过程总结

(3) 头文件包含指令,如#include "FileName"或者#include 等。 头文件中一般用伪指令#define定义了大量宏(最常见是字符常量),同时包含有各种外部符号声明。...程序中#include它们要使用尖括号()。另外开发人员也可以定义自己头文件,这些文件一般c源程序放在同一目录下,此时#include中要用双引号("")。...但并不是使用动态链接就一定比使用静态链接要优越。某些情况下动态链接可能带来一些性能上损害。...我们Linux使用gcc编译器便是把以上几个过程进行捆绑,使用户只使用一次命令就把编译工作完成,这的确方便了编译工作,但对于初学者了解编译过程就很不利了,下图便是gcc代理编译过程: ?...cc –S 汇编 将.s 文件转化成 .o文件 使用gcc 命令是:gcc –c 对应于汇编命令是 as 链接 将.o文件转化成可执行程序 使用gcc 命令是: gcc 对应于链接命令是 ld

1K31

程序员C语言快速上手——工程篇(十二)

链接库 前言 虚拟内存 总结 理解链接 C程序编译四个阶段 预处理器 编译器 汇编器 链接器 总结 什么是链接 查看符号表 *拓展:nm命令查看符号类型 静态链接 函数库 静态库 打包静态链接静态库...,而GCC工具链接,也并未直接使用链接器进行链接,而是使用collect2库来处理链接,它会调用各种初始化函数,并使用libgcc库来设置__main符号,从而将main函数作为入口。...静态链接程序体积大,如果多个程序使用相同静态库,那么每个程序都会包含相同部分。无论是对于磁盘还是内存,这都是一种空间浪费。...那么问题来了, 链接如何知道int_div引用是一个静态符号还是一个动态符号呢? 这实际上就是我们要在编译关联libcalc.dll原因。...动态库中保存了完整符号信息, 链接解析符号就可以知道int_div是一个定义动态库中动态符号。这样链接器就可以对int_div引用做特殊处理, 使它成为一个对动态符号引用。

1.3K20

一文带你了解静态库和动态库

linux中通常以.a(archive)为后缀 还是拿前面的例子来说,我们使用静态链接构建我们可执行文件: $ gcc -c main.c $ gcc -static -o main main.o -...放在最后它是这样一个解析过程: 链接器从左往右扫描可重定位目标文件和静态库 扫描main.o,发现一个未解析符号exp,记住这个未解析符号 扫描libm.a,找到了前面未解析符号,因此提取相关代码...什么是动态库 动态库和静态库类似,但是它并不在链接将需要二进制代码都“拷贝”到可执行文件中,而是仅仅“拷贝”一些重定位和符号表信息,这些信息可以程序运行时完成真正链接过程。...这也不在本文讨论范围。 加载速度不一样 由于静态链接就和可执行文件一块了,而动态库加载或者运行时才链接,因此,对于同样程序,静态链接要比动态链接加载更快。...总结 静态库和动态库具体是何如链接已经超出了本文介绍范围,本文简单介绍了一些静态库和动态库区别,另外文中提到在其他linux系统,也指的是同样处理器架构系统。

94520

《程序员自我修养》第三章学习笔记

4,Linux下命令: $: file   ***   显示出对应文件类型 目标文件是什么样 1,目标文件包含内容:编译后机器指令代码、数据,还有链接一些信息(比如符号表、调试信息、字符串等...3.5.2 特殊符号 1,ld链接器产生可执行文件,会给我们定义很多符号(没有自己程序中定义),但是可以直接声明并且引用它,我们称之为特殊符号。...3.5.5 弱符号符号 1,多个目标文件含有相同名字全局符号定义,链接将会出现符号重复定义错误。 2,编译器默认函数和初始化了全局变量为强符号,未初始化全局变量为弱符号。...5,弱引用强引用: 强引用:假如链接没找到该符号定义,链接器就会报符号未定义错误。 弱引用:假如链接没找到该符号定义,链接器不会报错,默认其为0或是一个特殊值。...8,补充: Linux中支持多线程需要在编译加上 –lpthread 选项, 比如 gcc test.c -lpthread 3.6 调试信息 1,gcc编译加上 –g 参数就会在产生目标文件里面加上调试信息

1.1K60
领券