kubo39's blog

ただの雑記です。

Nimと名前修飾の小ネタ

NimはDWARF v5の時点では DW_AT_language の割当はないけど、ソースコードはDWARFに入れることが できて $ eu-readelf --debug-dump=info hello とかで確認できる。

proc main() =
    echo "Hello!"

main()
$ nim c --debugger:native hello.nim
(...)
$ file hello
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=db5c80607aaed2ec154efb5863143879931d59c6, for GNU/Linux 3.2.0, with debug_info, not stripped
$ eu-readelf --debug-dump=info hello
(なんかいっぱい出る)

ただしdemanglerはないのでどうするかというと、 --debugger:native を指定したときに生成される hoge.ndiというファイルに名前修飾された変数・プロシージャとソースコードの対応がある。

$ find ~/.cache/nim/hello_d/ -name "*.ndi" # ~/.cache の下になんか生えてる
/home/kubo39/.cache/nim/hello_d/stacktraces.ndi
/home/kubo39/.cache/nim/hello_d/dragonbox.ndi
/home/kubo39/.cache/nim/hello_d/formatfloat.ndi
/home/kubo39/.cache/nim/hello_d/ansi_c.ndi
/home/kubo39/.cache/nim/hello_d/memory.ndi
/home/kubo39/.cache/nim/hello_d/assertions.ndi
/home/kubo39/.cache/nim/hello_d/dollars.ndi
/home/kubo39/.cache/nim/hello_d/since.ndi
/home/kubo39/.cache/nim/hello_d/miscdollars.ndi
/home/kubo39/.cache/nim/hello_d/io.ndi
/home/kubo39/.cache/nim/hello_d/schubfach.ndi
/home/kubo39/.cache/nim/hello_d/countbits_impl.ndi
/home/kubo39/.cache/nim/hello_d/system.ndi
/home/kubo39/.cache/nim/hello_d/coro_detection.ndi
/home/kubo39/.cache/nim/hello_d/bitops_utils.ndi
/home/kubo39/.cache/nim/hello_d/widestrs.ndi
/home/kubo39/.cache/nim/hello_d/digitsutils.ndi
/home/kubo39/.cache/nim/hello_d/iterators.ndi
/home/kubo39/.cache/nim/hello_d/hello.ndi

中身はこんな感じのテキストデータになっている。

$ head -5 ~/.cache/nim/hello_d/hello.ndi 
main    main__hello_1   /home/kubo39/dev/nim/hello.nim  1       5
args    args    /home/kubo39/.choosenim/toolchains/nim-1.6.8/lib/system/io.nim  804     19
locals  locals  /home/kubo39/.choosenim/toolchains/nim-1.6.8/lib/system.nim     2209    29

ndiは https://github.com/nim-lang/Nim/blob/7f6e800cafc7b73625893fb5280eb8b51a15b252/compiler/ndi.nim をみると Nim Debug Info の略っぽい。

ただし、こいつは別にnim-gdbで対応しているわけでもないし、nmやc++filtに喰わせればいい感じにしてくれるというフォーマットでもない。 そのため現状では対応したければ自分で頑張る必要がある。

一応Callgrind対応にかんしては https://github.com/kraptor/nim_callgrind というpythonスクリプトを提供している人もいる。