热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

如何检查.so中定义的宏?我会使用nm来检查功能,是否可以对宏执行相同的操作?

如何解决《如何检查.so中定义的宏?我会使用nm来检查功能,是否可以对宏执行相同的操作?》经验,为你挑选了1个好方法。

我在mylib.h中有这样的代码,然后使用它来创建mylib.so。有没有办法检查.so中如何定义MY_MACROS?

#ifdef SWITCH_CONDITION
    #define MY_MACROS       0
#else
    #define MY_MACROS       1
#endif

如果那是一个函数,我会简单地做

nm mylib.so | grep myfunction

有没有办法对宏做同样的事情?

PS应该是因为

> grep MY_MACROS mylib.so 
> Binary file mylib.so matches

Steve Summit.. 5

通常,无法对宏执行此类操作。(但请参阅下文。)

理论上,预处理器宏是一个编译时概念。事实上,在C的早期实现中,预处理器是-字面-一个独立的程序,在一个单独的进程中运行,转换的C代码与#include#define#ifdef成没有它们的C代码。实际的C编译器仅看到“预处理”代码。

现在,从理论上讲,编译器可以以某种方式保存一些宏定义的记录,也许有助于调试。我不知道有谁这样做,尽管显然使用DWARF格式的人确实可以做到!请参阅下面的评论和@ JL2210的答案。

您始终可以编写自己的显式代码来跟踪某些宏的定义。例如,我经常写代码来延长

void print_version()
{
    printf("myprogram version %s", VERSION_STRING);
#ifdef DEBUG
    printf(" (debug version)");
#endif
    printf("\n");
}

一些项目具有相当复杂的机制来跟踪对特定构建有效的编译开关。例如,在由configure脚本管理的项目中,通常config.status为后代提供一个文件,其中包含所有编译选项的一条记录。



1> Steve Summit..:

通常,无法对宏执行此类操作。(但请参阅下文。)

理论上,预处理器宏是一个编译时概念。事实上,在C的早期实现中,预处理器是-字面-一个独立的程序,在一个单独的进程中运行,转换的C代码与#include#define#ifdef成没有它们的C代码。实际的C编译器仅看到“预处理”代码。

现在,从理论上讲,编译器可以以某种方式保存一些宏定义的记录,也许有助于调试。我不知道有谁这样做,尽管显然使用DWARF格式的人确实可以做到!请参阅下面的评论和@ JL2210的答案。

您始终可以编写自己的显式代码来跟踪某些宏的定义。例如,我经常写代码来延长

void print_version()
{
    printf("myprogram version %s", VERSION_STRING);
#ifdef DEBUG
    printf(" (debug version)");
#endif
    printf("\n");
}

一些项目具有相当复杂的机制来跟踪对特定构建有效的编译开关。例如,在由configure脚本管理的项目中,通常config.status为后代提供一个文件,其中包含所有编译选项的一条记录。


@ JL2210我很想做同样的事情!您可能已经知道这一点,但是在重新设计轮子之前,请检查https://en.wikipedia.org/wiki/DWARF上的外部链接。
推荐阅读
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
author-avatar
o0大大脸么么小小鱼0o
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有