当前位置:网站首页>C专家编程 第5章 对链接的思考 5.4 警惕Interpositioning
C专家编程 第5章 对链接的思考 5.4 警惕Interpositioning
2022-08-04 04:44:00 【weixin_客子光阴】
Interpositioning(有些人称它为”interposing”)就是通过编写与库函数同名的函数来取代该库函数的行为。不仅你自己所进行的所有对该库函数的调用将被自己版本的函数调用所取代,而且所有调用该库函数的系统调用也将用你的函数取而代之。Interpositioning本身并不是bug,它是编译器明确要求支持的。
不要让程序中的任何符号成为全局的,除非有意把它们做成程序的接口之一。
mktemp现在已被ANSI C标准库函数tmpname所取代。
列出的标识符不应该出现在自己程序程序的声明中。其中有些标识符是始终保留的,其他一些则只有在包含一个特定的头文件后才是保留的。还有些标识符只在全局范围内才是保留的,其他一些则无论在全局范围还是在文件范围都予以保留。同时要注意所有的关键字都是保留的。避免麻烦最容易的方法就是认为这些标识符始终属于系统所有,不把它们用作自己的标识符。
有几项看上去像这样: is[a-z]anything
这表示任意以“is”开头,后面跟一个从a~z的小写字母(但不包括诸如数字之类的东西),然后再接任意字符。
另外有几项看上去像这样:acos, -f, -l。
它表示3个标识符acos、acosf、acosl都是保留的。所有位于math头文件内的函数都有一个接受一个double参数的基本版本。那里可能有两个额外的版本:基本名后加后缀l表示该函数接受一个long double参数:基本名后加后缀f表示该函数接受一个float参数。
ANSI C标准第6.1.2节规定,对于外部的标识符,编译器可以自行定义,使它们不区分大小写。同时,外部标识符的前6个字符必须与其他标识符不同(ANSI C标准第5.2.4.1节,“编译限制”)。对于所链接的其他函数库,也有一些需要避免使用的符号。你应该查看ABI文档,看看有那些标识符需要避免。
如果标识符是被保留的,就表示用户不能重新定义它。然而,这不是一个约束条件。当这种情况发生时,它并不要求编译器给出错误信息。它只是造成一些不可移植问题或出现未定义的行为。
可以在ld程序中使用-m选项,让编译器产生一个报告。它里面包括了被Interpose的符号的说明。通常,带-m选项的ld会产生一个内存映射或列表,显示在可执行文件的什么地方放入了那些符号。它同时显示了同一个符号的多个实例,通过查看报告的内容,用户可以判断是否发生了Interpositioning。
ld程序中的-D选项是随SunOS5.3引入的,目的是提供更好的链接-编辑调试。这个选项允许用户显示链接-编辑过程和所包含的输入文件。如果需要监视从archive中提取对象的过程,这个选项尤其有用。它同时可用于显示运行时绑定信息。
ld复杂程序的说明:
*使用ldd命令列出可执行文件的动态依赖集。这条命令会告诉你动态链接的程序所需要的函数库
*ld程序的-Dhelp选项能提供一些信息,有助于查找链接过程中出现的问题:
*查看ld程序的在线文档;
*阅读SunOs Linker and Libraries Manual
边栏推荐
猜你喜欢

目标检测-中篇

基于 SSE 实现服务端消息主动推送解决方案

深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型

结构体指针知识要点总结

文件系统的简单操作
2022年软件测试——精选金融银行面试真题

震惊,99.9% 的同学没有真正理解字符串的不可变性

Enterprise live broadcast is on the rise: Witnessing focused products, micro-like embracing ecology

本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现

Basic characteristics of TL431 and oscillator circuit
随机推荐
Jenkins export and import Job Pipeline
帮助企业实现数字化转型成功的八项指导原则
Cache pool of unity framework
中信证券网上开户怎么开的?安全吗?
基于gRPC编写golang简单C2远控
如何动态添加script依赖的脚本
转:管理是对可能性的热爱,管理者要有闯进未知的勇气
使用Patroni回调脚本绑定VIP的坑
Mobile payment online and offline payment scenarios
2022杭电多校联赛第五场 题解
【SemiDrive源码分析】【MailBox核间通信】47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试
How class only static allocation and dynamic allocation
【21 Days Learning Challenge】Direct Insertion Sort
某母婴小程序加密参数解密
docker安装mysql与宿主机相差8小时的问题。
大型连锁百货运维审计用什么软件好?有哪些功能?
SQL query String field less than 10 how to check
JVM Notes
劝退背后。
Introduction to mq application scenarios