Unix系统中nm命令展示目标文件符号的方法
在unix系统中,通过gnu开源gcc或者g++工具生成的目标文件(object file),可以用nm
、objdump
和readelf
这三个命令来查看。
之前在调试makefile文件的时候,链接动态库出错:libsrcpbl.so: undefined reference to 'gcProgramName'
。也就是变量gcProgramName没定义,后来通过nm -u libsrcpbl.so
命令辅助排查解决了。
在unix系统中,通过gnu开源gcc或者g++工具生成的目标文件(object file),可以用nm
、objdump
和readelf
这三个命令来查看。
之前在调试makefile文件的时候,链接动态库出错:libsrcpbl.so: undefined reference to 'gcProgramName'
。也就是变量gcProgramName没定义,后来通过nm -u libsrcpbl.so
命令辅助排查解决了。
昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错。链接命令大概是这样的:
/usr/bin/ld: cannot find -lmyhello collect2: error: ld returned 1 exit status好久没更新博客了,写篇文章除除草。这篇文章主要通过简单的例子说明一下Unix/Linux进程中如果捕捉和处理SIGTERM
、SIGUSR1
和SIGUSR2
信号。
先说明一下这三个信号:
SIGTERM:进程终止信号,效果等同于*nix shell中不带-9的kill命令; SIGUSR1:保留给用户使用的信号; SIGUSR2:同SIGUSR1,保留给用户使用的信号。在前文《再议C语言将十六进制字符串转成十进制整数》中 @大致 童鞋帮忙提了一个思路:直接将指针p
读取的十六进制字符串中的单个字符转换后的结果保存在iResult
中,而不是保存在指针p指向的内存中。这样思路更为简洁,下面是具体的两个实现程序。
前文《C语言将十六进制字符串转成十进制整数》讲述了将十六进制字符串中单个字符分别从高位到低位正序和从低位到高位逆序转换成对应的十进制数,今天在看原文的程序发现一个不好的地方:由于使用了char * p = HexStr;
,也就是直接使用指针p将这个十六进制字符串进行了读取和改写
。这样会造成在调用了HexStr2Integer
转换函数后,就不能再次使用这个十六进制字符串了。
因此,在转换过程中,可以考虑将原来的这个十六进制字符串在内存中复制一份,然后再对这个复制的副本
进行读写,这样就产生副作用了。下面是根据原来的两个程序改进的的代码,主要通过malloc
函数开辟一个内存空间,然后复制十六进制字符串中的数据到这个内存空间中,最后对它进行“读写”。
在下面这两个改进的代码中,还考虑到了这个十六进制字符串以0x
开头的形式出现,所以增加了这种情况的处理。
网上看到一个关于指向指针的指针变量(间级指针)和指针数组的分析题,感觉比较有代表性,所以摘录了下来自己分析了一番。
在百度知道看到个问题,原地址不记得了。题目大致是5位选手参加某歌唱比赛,然后6个评委依次为每位选手打分,最终要求出每位选手在去掉一个最高分和最低分后,自己的平均成绩是多少。然后有人给出了一个比较巧妙的答案,遍历二维数组中的每个元素的时候,“找出”最大值和最小值,然后就去掉这个最大值和最小值求出平均值了。
之前在弄完这个十六进制字符串异或的工具后,发现直接按回车键就直接关闭了工具。网上搜了下解决方案,然后自己的总结如下4种方法:
如前文小节5中所述,只要将“进行异或”这个按钮属性中的Default Button设置为"TRUE"就行了。但是这样就直接触发这个按钮对应的事件OnBnClickedButton1,而不是对输入的数据进行合法性检查。
首先我们需要找到这两个函数的位置,方法有两种,效果都是殊途同归: