3

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

这个 readelf 示例显示了第 3 列对象的大小(字节),

在大型对象上,readelf 以十六进制而不是十进制打印,

这打破了我的尺寸排序尝试。(排序忽略十六进制值)

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?

谢谢

4

2 回答 2

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'
于 2019-03-06T18:35:23.160 回答
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,} 
于 2019-03-06T18:33:02.283 回答