Как дизассемблировать несколько функций с помощью Linux-утилиты objdump?

Директива Conflict=на самом деле не то, что вам нужно, не только потому, что она работает в обоих направлениях, но и потому, что вы не хотите останавливать текущую B.service(, если она выполняется ), когда A.service] начинается.

Я бы порекомендовал вам реализовать это путем добавления в B.serviceдополнительного сценария, который будет проверять, запущен ли A.service, и в этом случае предотвращать запуск B.service.

Вы можете сделать это, добавив ExecStartPre=к B.service, который завершается с нулевым статусом, отличным от -, что предотвратит его дальнейший запуск при запуске.

Я предлагаю добавить что-то подобное к существующему/etc/systemd/system/B.service:

ExecStartPre=/bin/sh -c 'if systemctl -q is-active A.service; then \
                             echo "A.service already running, will not start B.service"; \
                             exit 75; \
                         fi'

Используетсяsystemctl is-activeдля проверки того, запущена ли в данный момент служба A.service.

Если это не так, то выводится сообщение (, которое попадает в журнал и, что более важно, отображается всякий раз, когда вы проверяете systemctl status B.service. )Кроме того, он завершится с ненулевым -статусом. Я выбрал код выхода 75, так как systemd покажет это как EX_TEMPFAIL, что означает «Временный сбой; пользователю предлагается повторить попытку». См. здесь , чтобы узнать, как systemd интерпретирует/именует коды выхода для обработки.

Перенос строк также необязателен,вы можете просто написать все в одной строке, просто опуская конечный \, используемый для их переноса.

3
14.07.2020, 13:58
1 ответ

Я не вижу способа сообщить программе objdump из binutils или elfutils, чтобы она ограничивала дизассемблирование определенными функциями. Однако есть несколько обходных путей.

Предположим, что список интересующих нас функций находится в файлеlist:

$ nm -P basicmath_small |
    awk '{ if ($2 == "T" && $1 != "main" && substr($1,1,1) != "_") print $1}' > list
$ cat list
deg2rad
rad2deg
SolveCubic
usqrt
  • Используйте awk для фильтрации большого вывода дизассемблирования из objdump. Каждая интересующая область начинается со строки, которая заканчивается на <functionname>:, и продолжается до пустой строки (или до конца -файла -).

$ xargs < list | sed -e 's/^/<(/' -e 's/ /|/g' -e 's/$/)>:\$/' > rlist
$ cat rlist
<(deg2rad|rad2deg|SolveCubic|usqrt)>:$
$ objdump -d -j.text basicmath_small | awk -v rlist="$(cat rlist)" \
    '{ if ($0 ~ rlist) doprint=1; if ($0 == "") doprint=0; if (doprint) print }'

0000000000400fc0 <rad2deg>:
  400fc0:       f2 0f 59 05 c8 4d 0a    mulsd  0xa4dc8(%rip),%xmm0        # 4a5d90 <c2+0x10>
  400fc7:       00
  400fc8:       f2 0f 5e 05 b8 4d 0a    divsd  0xa4db8(%rip),%xmm0        # 4a5d88 <c2+0x8>
  400fcf:       00
  400fd0:       c3                      retq
  400fd1:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
  400fd6:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  400fdd:       00 00 00
0000000000400fe0 <deg2rad>:
  400fe0:       f2 0f 59 05 a0 4d 0a    mulsd  0xa4da0(%rip),%xmm0        # 4a5d88 <c2+0x8>
  400fe7:       00
  400fe8:       f2 0f 5e 05 a0 4d 0a    divsd  0xa4da0(%rip),%xmm0        # 4a5d90 <c2+0x10>
  400fef:       00
  400ff0:       c3                      retq
  400ff1:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  400ff8:       00 00 00
  400ffb:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
0000000000401000 <SolveCubic>:
  401000:       f2 0f 5e c8             divsd  %xmm0,%xmm1
...
  • используйте objdump из Go , который принимает параметр -s regexp

$ xargs < list | sed -e 's/^/^(/' -e 's/ /|/g' -e 's/$/)\$/' > rlist
$ cat rlist
^(deg2rad|rad2deg|SolveCubic|usqrt)$
$ go tool objdump -s "$(cat rlist)" basicmath_small

TEXT rad2deg(SB)
  :0                    0x400fc0                f20f5905c84d0a00        MULSD 0xa4dc8(IP), X0
  :0                    0x400fc8                f20f5e05b84d0a00        DIVSD 0xa4db8(IP), X0
  :0                    0x400fd0                c3                      RET

TEXT deg2rad(SB)
  :0                    0x400fe0                f20f5905a04d0a00        MULSD 0xa4da0(IP), X0
  :0                    0x400fe8                f20f5e05a04d0a00        DIVSD 0xa4da0(IP), X0
  :0                    0x400ff0                c3                      RET

TEXT SolveCubic(SB)
  :0                    0x401000                f20f5ec8                DIVSD X0, X1
...
1
18.03.2021, 23:19

Теги

Похожие вопросы