この質問 から抜け出し、Linux上のSQL Server2017を起動するためにカーネルにパッチを適用しました。今、私はさらに進んでいますが、私はシャットダウンされています、
_strstr("TracerPid:\t0\n", "TracerPid:") = "TracerPid:\t0\n"
strtol(0x7fe0cf01840b, 0x7ffd380d5eb0, 10, 0) = 0
free(0x7fe0cf018400) = <void>
fclose(0x7fe0cf011980) = 0
getpid() = 3474
getpid() = 3474
getauxval(31, 9, 5, 0x7fe0d034ea67) = 0x7ffd380dcfe0
strncpy(0x7ffd380d5f00, "/opt/mssql/bin/sqlservr", 4095) = 0x7ffd380d5f00
realpath(0x7ffd380d5f00, 0x7ffd380d6f00, 0, 0x7fe0d0323720) = 0x7ffd380d6f00
getpid() = 3474
abort( <no return ...>
--- SIGABRT (Aborted) ---
_
proc
をチェックした後、SQL Serverは、フォールバックと同じことを行うために他のブードゥーを実行します。これは、誰もソフトウェアを機能させようとしない「非常に安全」なためです。
さて、getauxval(3)
を使用して、プロセスがトレースされているかどうかを判断できるかどうか疑問に思っていますか? CAPABILITIES
は、これが_CAP_SYS_ADMIN
_および_CAP_SYS_PTRACE
_で可能であることを示しているようです。
GETAUXVAL()
の最初の引数は何かを言っていると思います。
_getauxval(31, 9, 5, 0x7fe0d034ea67)
_
開く _/usr/include/x86_64-linux-gnu/bits/auxv.h
_ 、私はそれを見ることができます
_#define AT_EXECFN 31 /* Filename of executable. */
_
そのため、実行可能ファイルのファイル名を取得しようとしています。実際には、ドキュメントと以下の例に基づくパス名です。この場合、それはトレーサーのパス名であり、ターゲットではありません。次に、パスが同じであることを確認するためにrealpath
を呼び出しています。 getauxval()
、
_$ LD_SHOW_AUXV=1 strace sleep 1
AT_SYSINFO_EHDR: 0x7ffd6d96f000
AT_HWCAP: bfebfbff
AT_PAGESZ: 4096
AT_CLKTCK: 100
AT_PHDR: 0x5640b6cad040
AT_PHENT: 56
AT_PHNUM: 9
AT_BASE: 0x7fc9ce4fc000
AT_FLAGS: 0x0
AT_ENTRY: 0x5640b6d09440
AT_UID: 1000
AT_EUID: 1000
AT_GID: 1000
AT_EGID: 1000
AT_SECURE: 0
AT_RANDOM: 0x7ffd6d909669
AT_HWCAP2: 0x0
AT_EXECFN: /usr/bin/strace
AT_PLATFORM: x86_64
_