![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编译、连接
文章平均质量分 53
汇总平时学习遇到的各种关于编译方面的知识点。
Ruo_Xiao
己所不欲,勿施于人。
展开
-
Linux / .symtab 和 .dynsym 区别和联系
动态符号表 (.dynsym) 用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。而 .symtab 则保存所有符号,包括 .dynsym 中的符号。原创 2023-02-13 06:46:57 · 596 阅读 · 0 评论 -
_GLIBCXX_USE_CXX11_ABI 宏的作用
这样虽然符合了 C++11 的标注,旧版就无法兼容了。为了解决这个问题,对于旧版而言,GCC 5.1 添加了 __cxx11 命名空间,GCC5.1 或者说 C++11 规范下的 string 和 list,实际上是std::__cxx11::string 和 std::__cxx11::list,所以我们一般的 using namespace std 就会变成形如using namespace std::__cxx11 的样子。-D_GLIBCXX_USE_CXX11_ABI=0 链接旧版库。...转载 2022-08-02 19:04:48 · 2474 阅读 · 1 评论 -
gcc __attribute__ 关键字举例之 visibility
visibility 用于设置动态链接库中函数的可见性,将变量或函数设置为 hidden,则该符号仅在本so中可见,在其他库中则不可见。g++ 在编译时,可用参数 -fvisibility 指定所有符号的可见性(不加此参数时默认外部可见,参考man g++中 -fvisibility 部分);若需要对特定函数的可见性进行设置,需在代码中使用__attribute__ 设置 visibility 属性。编写大型程序时,可用 -fvisibility=hidden 设置符号默认隐藏,针对特定变量和函数,在代码中转载 2022-07-13 06:56:47 · 457 阅读 · 0 评论 -
动态库连接 - 符号冲突 - 全局符号介入
动态符号符号连接时的符号冲突,另一种专业术语是共享对象的全局符号介入。一个共享对象里面的全局符号被另一个共享对象的全局符号覆盖的现象又被称为共享对象的全局符号介入。全局符号介入这个问题,实际上 Linux 下的动态链接器是这样处理的:它定义了一个规则,那就是当一个符号需要被加入到全局符号表时,如果相同的符号名已经存在,则后加入的忽略(忽略正在加入的符号)。1、简单点libA.hlibA.clibB.h libB.cload_main.c编译方式1,先链接 liba.so 再链转载 2022-06-24 15:25:22 · 1136 阅读 · 0 评论 -
gcc / -E、-S、-c 和 -o
@time 2019-07-21@author Ruo_Xiao1、C++代码编译成可执行程序,会经历如下过程:预处理 --> 汇编文件 --> 目标文件 --> 可执行文件2、上述各个过程都可以通过 gcc 的编译选项来分别进行处理。编译选项 生成文件 代码示例 -E 预处理文件(main.i) g++ -...原创 2019-07-21 10:12:06 · 4517 阅读 · 0 评论 -
gcc / -Wl
默认情况下,GCC / G++ 链接时优先链接动态库,如果没有动态库,则链接相应的静态库。同时,GCC / G++ 也提供了链接选项 -Wl,-Bstatic 和 -Wl,-Bdynamic 供用户指定链接动态库或者静态库。-Wl,-Bstatic 指示跟在后面的 -lxxx 选项链接的都是静态库。 -Wl,-Bdynamic 指示跟在后面的 -lxxx 选项链接的都是动态库。栗子:-Wl,-Bstatic -llog4cplus -lpcap -lpgm -lxerces-c -Wl,-Bd转载 2021-10-10 06:56:53 · 359 阅读 · 0 评论 -
gcc / -Wl,--as-needed、 -Wl,--no-as-needed
一、说明gcc 提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 两个选项,这两个选项一个是开启特性,一个是取消该特性。在生成可执行文件的时候,通过 -lxxx 选项指定需要链接的库文件。以动态库为例,如果我们指定了一个需要链接的库,则连接器会在可执行文件的文件头中会记录下该库的信息。而后,在可执行文件运行的时候,动态加载器会读取文件头信息,并加载所有的链接库。在这个过程中,如果用户指定链接了一个毫不相关的库,则这个库在最终的可执行程序运行时也会被加载,如果类似这样的转载 2022-04-28 10:46:44 · 3763 阅读 · 0 评论 -
gcc / 控制错误和警告信息的选项
-Werror:将警告转换成错误。-Wno-error=foo:保持警告“foo”不被转换成错误,即使 -Werror 被指定。-Wfoo:使能警告 “foo”。-w:禁用所有警告。-Weverything、-Wall:使能所有警告。(SAW:Game Over!)...原创 2022-04-28 17:05:37 · 1580 阅读 · 0 评论 -
C/C++ linux 无锁化编程
gcc 从 4.1.2 开始提供了__sync_* 系列的 build-in 函数,用于提供加减和逻辑运算的原子操作,其声明如下:// 等同于将 ptr 指向的内存加上 value 值, 并且返回 ptr 原来的值。type __sync_fetch_and_add (type *ptr, type value, …);type __sync_fetch_and_sub (type *ptr, type value, …);type __sync_fetch_and_or (type *ptr,转载 2022-04-01 07:36:19 · 285 阅读 · 0 评论 -
linux / 命令行 / LD_DEBUG 命令
最近在学习 libevent 时报错,如下:./server: error while loading shared libraries: libevent_core-1.4.so.2: cannot open shared object file: No such file or directory查找系统目录,在 /usr/local/lib 中确实找到了该文件,但是为什么可执行程序没有发现呢?经过查找资料,发现命令 LD_DEBUG 可以解决该问题。通过执行命令:LD_DEBU.原创 2021-03-16 10:41:26 · 1068 阅读 · 1 评论 -
gcc / -Wl,-Bsymbolic
一、问题在动态库中含有全局变量A,在应用程序中也使用了全局变量 A,这个时候在应用程序中修改全局变量 A 的时候也会修改动态库中的 A。如何不修改呢?在创建动态链接库时,gcc / g++ 选项中添加编译选项:-Wl,-Bsymbolic二、栗子main.c#include "tool.h"#include <stdio.h>int i = 100;int main() { printf("main,i = %d\n",i); printData.原创 2022-04-28 16:54:23 · 2100 阅读 · 0 评论 -
gcc / -ffunction-sections、-fdata-sections、-Wl,--gc-sections
一、背景有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的 ROM 和 RAM 的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。二、参数详解为了解决前面分析的问题,我们引入了标题中的几个参数。GCC链接操作是以 section 作为最小的处理单元,只要一个 section 中的某个符号被引用,该 section 就会被加入到可.转载 2022-04-28 09:34:02 · 1862 阅读 · 0 评论 -
gcc / --hash-style
1、DT_HASHELF 中的一个 Sections,保存了一个用于查找符号的散列表,用于支持符号表的访问,能够提高符号搜索速度。2、--hash-style=style(以下解释摘自man ld)转载 2022-04-28 17:30:28 · 639 阅读 · 0 评论 -
gcc / -L 和 -Wl,-rpath 区别
首先需明确一点,链接阶段查找库的位置和运行时查找库的位置是两码事。-L 指定编译链接时库的搜索目录。 -Wl,-rpath 指定程序运行时库搜索目录。可以使用 ldd 命令查看生成的可执行程序的关联的库的路径,可以发现, 当编译时使用 -L 指定库路径时,ldd 中显示的库路径在系统环境变量中该库所在的路径。 当编译时使用-Wl,-rpath 指定库路径时,ldd 中显示的库路径为人为指定的库的路径。 (SAW:Game Over!)...原创 2020-12-02 11:21:07 · 1514 阅读 · 0 评论 -
gcc 编译参数 -fPIC 作用
在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结:fPIC的全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转。1、不加fPIC选项即使不加fPIC也可以生成.so文件,但是对于源文件有要求,例如因为不加fPIC编译的so必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码如下:#include <转载 2021-06-05 09:51:52 · 22502 阅读 · 0 评论 -
gcc / -I(大写i)、-L 和 -l(小写L)
@time 2019-07-28@author Ruo_Xiao一、“ -I ” 设定头文件的搜索目录。一般头文件的搜索目录为当前程序所在目录以及系统变量指定的目录,加上该选项,则优先去选项指定的目录查找。 该选项在预处理阶段使用。二、“ -L ” 设定库文件的搜索目录。三、“ -l ” 设定该程序要连...原创 2019-07-28 07:30:04 · 1050 阅读 · 0 评论 -
编译 / __attribute__(constructor)和__attribute__(destructor)
一、前言最近看代码,看到一个函数前面用 __attribute__((constructor)) 修饰,搜了整个程序,没发现哪个地方调用这个函数。如下:__attribute__((constructor)) void load_file(){ printf("Constructor is called.\n"); g_count = (int *)malloc(sizeof(int));}二、__attribute__ 介绍__attribute__ 可以设置函数属性转载 2021-12-21 07:02:03 · 193 阅读 · 0 评论 -
本地编译和交叉编译的区别
2018-07-03 创建人:Ruo_Xiao邮箱:xclsoftware@163.com本地编译:在当前编译平台下编译出来的程序只能在当前平台下运行。交叉编译:在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序。...原创 2018-07-03 14:30:30 · 4535 阅读 · 0 评论 -
解释器和编译器的区别
----------------------------------------------- 创建人:Ruo_Xiao-- 邮箱:xclsoftware@163.com---------------------------------------------1、解释器(1)原理:一条一条的解释执行源代码。(2)栗子:比如php,postscritp,javascr...原创 2018-10-27 15:09:48 · 208 阅读 · 0 评论 -
内联函数有什么优点?内联函数与宏定义的区别?
内联函数的优点内联函数比宏定义更加的安全,因为前者进行参数检查,而后者仅仅是简单地文本替换。内联函数和宏定义的区别宏定义是在预处理阶段进行的文本替换。 内联函数是在编译阶段进行的替换,优点是减少调用过程,缺点是使代码膨胀。(SAW:Game Over!)...原创 2020-02-12 09:59:19 · 513 阅读 · 0 评论