Linux readelf показывает размеры объектов с различной системой счисления (Hex и Dec) - PullRequest
3 голосов
/ 06 марта 2019

Я исследую некоторые объекты внутри ELF-файла и использую readelf для этой цели.

Этот образец readelf показывает размер (в байтах) объектов в столбце 3,

В целомобъекты, печатные копии в шестнадцатеричном формате вместо десятичных,

Это ломает мои попытки сортировки по размеру.(сортировка игнорирует шестнадцатеричное значение)

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

Столбец размера (3) переводится в dec, что хорошо,

Но также столбец 2 переводится в dec, что плохо ..

Я нашел это:

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

из

найти-и-заменить-привязать-к-определенному-столбцу-одному-вкладышу

Но я не могу объединить эти две команды.

Как я могу перевести только столбец 3 в декабрь?

Спасибо

Ответы [ 2 ]

3 голосов
/ 06 марта 2019

Преобразовывать только последовательности, начинающиеся с 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 голос
/ 06 марта 2019

Попробуйте это:

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,} 
...