Linux readelf显示具有不同数字系统(十六进制和十进制)的对象大小

时间:2019-03-06 17:57:29

标签: regex linux perl elf readelf

我正在研究ELF文件中的一些对象,并为此目的使用了readelf。

这个readelf样本显示第3列上对象的大小(字节)

在大对象上,readelf以十六进制而不是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

我尝试将所有十六进制转换为dec:

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

size列(3)转换为dec,很好,

但第2列也转换为dec,这是不好的。

我发现了:

perl -lane '$F[1]=~tr/A/B/;print join("\t", @F)' file

来自

find-and-replace-confined-to-a-specific-column-one-liner

但是我似乎无法将这两个命令组合在一起。

如何仅将第3列转换为dec?

谢谢

2 个答案:

答案 0 :(得分:3)

仅转换以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'

答案 1 :(得分:1)

尝试一下:

readelf -sW target.elf | perl -pe 's/(?m)^(?:\S+[ ]+){2}\K(0x)?[0-9a-f]{5,}/hex $&/ge' | sort -k 3 -n -r 

仅在第三列上有效。

正则表达式:

 (?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,}