首页
学习
活动
专区
工具
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.8K20

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.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.9K30

    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.8K40

    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.4K20

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

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

    1K30

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

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

    5.2K32

    C语言头文件j解析

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

    2K88

    【Linux探索学习】第八弹——Linux工具篇(三):Linux 中编译器 GCC 编译原理和使用详解

    目标文件是二进制格式,包含了机器码和必要符号信息。 gcc -c -hello.s -o hello.o 4.4 链接 最后一步是链接。...链接器(如 ld)将一个或多个目标文件和所需库文件(如标准库)结合起来,生成最终可执行文件。链接主要任务包括: 符号解析:目标文件之间解决函数和变量引用。...其后缀名一般为“.a” 动态库之相反,在编译链接并没有把库文件代码加入到可执行文件中,而是程序执行时由运行时链接文件加载库,这样可以节省系统开销。...完成了链接之后,gcc 就可以生成可执行文件 我们用ldd指令可以查看一个可执行程序所依赖动态库: gcc在编译默认使用是动态链接,要想使其静态链接,需要在编译在后面加上-static 如下所示...: 动态链接gcc test.c -o mytest 静态链接gcc test.c -o mytest -static 我们平时使用时也不一定是纯动态链接或纯静态链接,也可能是两者混合 file

    15210

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

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

    1.2K30

    动态库静态库优缺点比较分析_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.2K20

    【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.7K00

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

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

    5K52

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

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

    12410

    gcc编译器参数_gcc for c4droid

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

    96130

    【linux】gcc makefile

    01.gcc如何完成 预处理(进行宏替换) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头代码行。...test.s gcc -c test.s -o test.o 03.函数库静态链接 软件开发中,链接是将一个或多个编译后目标文件(.o文件)和库文件合并,生成可执行文件或更大库文件过程。...其后缀名一般为“.a” 动态库之相反,在编译链接并没有把库文件代码加入到可执行文件中,而是程序执行时由运行时链接文件加载库,这样可以节省系统开销。...性能:某些情况下,静态链接应用程序启动和运行速度可能会更快,因为避免了运行时解析库符号开销。 缺点: 文件大小:可执行文件会包含所有静态链接代码,这会显著增加文件大小。...更新和维护:如果库需要更新(例如修复安全漏洞),则必须重新编译和链接整个应用程序。 动态链接 定义:动态链接中,程序使用库在编译不被复制到可执行文件中。

    5310

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

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

    23110

    编译连接过程总结

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

    1.1K31

    Ubuntu 系统中解决 `CXXABI_1.3.13` 找不到问题

    背景介绍 Ubuntu 系统中,CXXABI_1.3.13 是一个 C++ ABI(Application Binary Interface)相关符号,通常由 libstdc++ 库提供。...++ 库不包含所需 CXXABI_1.3.13 符号。...程序开发使用了更新版本 GCC 和 libstdc++,而运行时系统环境不匹配。本教程将逐步介绍如何在 Ubuntu 系统中解决这个问题。2....以下是一些其他可能解决方法:静态链接 libstdc++:在编译你应用程序时,可以尝试将 libstdc++ 静态链接到可执行文件中,避免依赖系统共享库。...使用容器化技术:如果你需要在多个环境中运行同一个程序,可以考虑使用 Docker 来创建一个一致运行环境,其中包含合适版本 GCC 和 libstdc++。

    34610
    领券