我正在研究精灵文件中的某些对象,并为此目的使用readelf。
此readelf的样本显示了第3列上的对象的大小(字节)
在大型物体上,在十六进制而不是dec中读取
这打破了我的大小分类尝试。(排序忽略十六进制值)
Num: Value Size Type Bind Vis Ndx Name
1369: 808ec6e8 2048 OBJECT LOCAL DEFAULT 26 _ZN2cvL12NNDeltaTab_iE
1370: 8086e6e8 0x20000 OBJECT LOCAL DEFAULT 26 _ZN2cvL13Lanczos4Tab_iE
我尝试将所有十六进制翻译成这样的十月:
readelf -sW target.elf | perl -pe 's/(0x)?[0-9a-f]{5,}/hex $&/ge' | sort -k 3 -n -r
并得到
1369: 2156840680 2048 OBJECT LOCAL DEFAULT 26 _ZN2cvL12NNDeltaTab_iE
1370: 2156324584 131072 OBJECT LOCAL DEFAULT 26 _ZN2cvL13Lanczos4Tab_iE
尺寸列(3)被翻译成DEC,这是好的,
,但第2列被翻译成DEC,这是不好的。
我找到了这个:
perl -lane '$F[1]=~tr/A/B/;print join("t", @F)' file
来自
查找和重新安装到特定的柱柱
,但我似乎无法结合这两个命令。
如何仅将第3列转换为DEC?
谢谢
仅转换以0x
开头的序列:
perl -pe's/0x([0-9a-f]+)/hex $1/ge'
仅转换以0x
开头的字段:
perl -pe's/(?<!S)0x([0-9a-f]+)/hex $1/ge'
仅在0x
开头时转换第三个字段:
perl -pe's/^(?:S+s+){2}K0x([0-9a-f]+)/hex $1/e'
尝试以下:
readelf -sW target.elf | perl -pe 's/(?m)^(?:S+[ ]+){2}K(0x)?[0-9a-f]{5,}/hex $&/ge' | sort -k 3 -n -r
仅在第三列上工作。
REGEX:
(?m) # Multi-line mode
^ # BOL
(?: S+ [ ]+ ){2} # First 2 columns
K # Disregard columns up to here
# Third column only
( 0x )? # (1)
[0-9a-f]{5,}