总体概述
2个多月的Windows下开发暂告段落后回归Linux,加上办公的Windows系统被切换为Linux界面发型版,对Linux的使用更深度了,本文主要记录最近遇到的问题和方案。
小事记录
vim之粘贴自动注释
办公生产全Linux后,不能在windows可视化编辑好后在通过SSH传到生产Linux,需要vim操作文本(办公Linux也有可视化编辑工具,易用性让我选择了vim)。在一次拷贝bash代码中,发现vim在遇到某行被注释则自动把后面代码都注释,原因是vim的formatoptions在编辑C代码时开启自动注释。
原始代码:
#include "b.h"
// a.c
void a() {
b();
}
粘贴展示:
#include "b.h"
// a.c
// void a() {
// b();
// }
vim在命令行模式下执行 set formatoptions? 可得到值为croql,其中的cro都与自动换行注释有关,解决方式为每次粘贴前命令行模式下执行set paste即可。
shell之仿造内置命令
Linux下提供了很多有用工具,如ls,cd,cat,通过man可以得到具体用法,而whereis则可以帮助找到命令所在目录。但是也有部分命令是无法whereis得到路径所在,如dirs,bind等,因为它们是bash内置命令。除了内置命令,还有其他方式达到whereis一样无法查探目的的方式。在阅读某开源项目时,发现某关键脚本存在如"xxcmd zz"之类代码,在脚本里无法找到对应定义,自己在shell下运行报无法找到对应命令,而网上搜索也无对应信息,索性执行grep在代码根目录查找,原来是另外脚本的一个function函数,被source引入了进来。
bash内置命令:
[zx@xxx sh]# whereis dirs
dirs: /usr/share/man/man1/dirs.1.gz
source仿造内置:
[zx@xxx sh]# cat two.sh
function two()
{
echo "[two]..."
}
[zx@xxx sh]# source two.sh
[zx@xxx sh]# two
[two]...
[zx@xxx sh]# whereis two
two:
alias仿造内置:
[zx@xxx sh]# alias cx=ls
[zx@xxx sh]# cx
one.sh two.sh
[zx@xxx sh]# whereis cx
cx:
在安全应急时,如果找不到对应命令,就需要在登录运行(如/etc/profile)和bash启动(如/etc/bashrc、~/.bashrc)逻辑查看是否有alias、source使用。
rpm打包之自动strip
在一个项目中,新增逻辑适配了某发型版的系统版本信息搜集和组件安装信息搜集,编译后运行存在偶尔发生段错误,重编开启debug并设置系统开启coredump,gdb查看core出在libc,而自己修改的是产品的x.so。针对coredump分析暂停,转到centos 7下自己改动前的版本对比查看,发现运行正常。回到出问题系统,nm查看x.so,报"nm: /home/x/lib/x.so:无符号"(正常运行的centos 7一样结果),而readelf -a可以查看到符号输出。找了个系统库,如/usr/lib64/libanl.so,nm发现是有输出的,初步得到是x.so被做了符号操作,什么时候做了什么操作,为什么nm不行而readelf可以。带着问题找答案。
nm无法查看符号
搜索给的参考是strip去除了符号信息,而什么时候去掉的,首先在源码路径进行了strip检索,未发现引用,怀疑是rpm打包自动执行。验证方法为手动Make打包,nm测试得到输出,很大可能rpm打包做了strip。进一步验证,在spec文件%install段设置%define __strip /bin/true,对打出rpm里x.so进行nm,也有输出。
nm不行而readelf可以
nm查看的是.symtab, .strtab,.dynsym,.dynstr,而strip会去除symtab, .strtab内容,从而导致nm显示内容少或无内容展示。readelf可读取elf文件全部段,所以永远有输出。
参考文献
[1]CSDN#nm 提示 no symbol#
[2]CSDN#Centos7 取消Vim自动注释#