静态库改为动态库后,可以影响到程序的执行结果
来源:互联网 发布:dnf卢克减防算法 编辑:程序博客网 时间:2024/05/13 19:39
源于systemd的例子
先看bus-error.h中的一个宏:
#define BUS_ERROR_MAP_ELF_REGISTER \ __attribute__ ((__section__("BUS_ERROR_MAP"))) \ __attribute__ ((__used__)) \ __attribute__ ((aligned(8)))
意思是将数据定义在BUS_ERROR_MAP段,8字节对齐,标记为已使用的
bus-error.c中定义了一个数组:
BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_standard_errors[] = { SD_BUS_ERROR_MAP("org.freedesktop.DBus.Error.Failed", EACCES), SD_BUS_ERROR_MAP("org.freedesktop.DBus.Error.NoMemory", ENOMEM), ...... SD_BUS_ERROR_MAP("org.freedesktop.DBus.Error.ObjectPathInUse", EBUSY), SD_BUS_ERROR_MAP_END};
test-bus-error.c中定义了两个数组:
BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors[] = { SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error", 5), SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-2", 52), SD_BUS_ERROR_MAP_END};BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map test_errors2[] = { SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-3", 33), SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-4", 44), SD_BUS_ERROR_MAP("org.freedesktop.custom-dbus-error-33", 333), SD_BUS_ERROR_MAP_END};
如果将bus-error.c编译到动态库,然后test-bus-error.c去连接该动态库,bus-error.c在.so中,有一个BUS_ERROR_MAP段;test-bus-error.c在.exe中,有另一个BUS_ERROR_MAP段,里面只有两个数组。
当使用如下代码打印数组时,就会发现动态连接的输出会少很多(只打印了test-bus-error.c中的两个数组):
extern const sd_bus_error_map __start_BUS_ERROR_MAP[];extern const sd_bus_error_map __stop_BUS_ERROR_MAP[];static void dump_mapping_table(void) { const sd_bus_error_map *m; printf("----- errno mappings ------\n"); m = __start_BUS_ERROR_MAP; while (m < __stop_BUS_ERROR_MAP) { if (m->code == BUS_ERROR_MAP_END_MARKER) { m = ALIGN8_PTR(m+1); continue; } printf("%s -> %i/%s\n", strna(m->name), m->code, strna(errno_to_name(m->code))); m ++; } printf("---------------------------\n");}
__start_BUS_ERROR_MAP和__stop_BUS_ERROR_MAP分别是段BUS_ERROR_MAP的起始和结尾地址,由GCC负责处理。
0 0
- 静态库改为动态库后,可以影响到程序的执行结果
- spark中可以影响到结果partition个数的操作
- 查看可以执行程序需要哪些动态库
- 如何将程序的执行文件和静态加载动态库放在不同的目录
- 帮忙写个小程序,可以双击后把电脑的IP地址和DNS服务器地址改为我想要的?
- X64位动态库,想改为静态库lib时,未指定MACHINE类型错误的解决方法fatal error LNK1112
- 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
- 动态和静态数组的sizeof结果
- 【笔记】unix系统下,多个静态库链接到一个可执行程序后,执行时出现莫名奇妙的问题
- 获取动态sql的执行结果
- opencv程序编译后执行找不到库
- windows下X64位动态库改为静态库导致的fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突
- MFC多线程socket程序由动态改为静态时 出现问题
- 最近写的一个makefile,可以配置编成elf,静态库,动态库
- Visual C++中静态库是否可以引用动态库?
- 黑马程序员-程序的执行结果
- 关于C文件执行的流程和动态库,静态库的概念
- 程序的动态执行过程
- Lua判断OS并添加cpath
- Struts2 拦截器处理普通Http请求和Ajax请求时拦截配置
- HDU 2578 Dating with girls(1)
- 30分钟上手最火android网络请求框架Retrofit
- Docker在PHP项目开发环境中的应用
- 静态库改为动态库后,可以影响到程序的执行结果
- GeekBand c++學習筆記之六(泛型編程概觀與關連特性)
- 练习5-3 用指针方式实现第2章中的函数strcat。函数strcat(s,t)将t指向的字符串复制到s指向的字符串的尾部
- kruskal
- linux 查看目录属性
- 【NOIP2013模拟】刺杀大使 题解
- oracle常用函数汇总——运算符
- 简述spring 的事务传播行为和 隔离级别
- Integer(String等函数类型) cannot be resolved to a type 错误解决方法