以下の内容はhttps://devlights.hatenablog.com/entry/2026/03/13/073000より取得しました。


Goメモ-666 (DWAR4形式でビルドする)(Go1.25以降, GOEXPERIMENT, nodwarf5)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。この情報が必要になる方はほとんどいないと思いますが。

cgoでsoファイルを作成して、それをC言語側から利用している場合で、gdb使ってデバッグしようとすると

以下のメッセージが出ました。

Dwarf Error: Cannot handle DW_FORM_addrx in DWARF reader [in module libXXXX.so]

ん?って思って調べると、この DW_FORM_addrx ってDWARF5から追加されたものでした。

最近のバージョンの gdb だとエラーは出ないのですが、世の中不思議なもので未だに超古い環境でデバッグしないといけないこともあったりします。例えば CentOS8 とか。

当然ながら、gdbのバージョンもとても古いです。なので、DWARF5に対応していないこともあります。

Go 1.24までは、デフォルトがDWARF4だったのですが、Go1.25からDWARF5がデフォルトになっています。

Go 1.25 Release Notes - The Go Programming Language

The compiler and linker in Go 1.25 now generate debug information using DWARF version 5. The newer DWARF version reduces the space required for debugging information in Go binaries, and reduces the time for linking, especially for large Go binaries. DWARF 5 generation can be disabled by setting the environment variable GOEXPERIMENT=nodwarf5 at build time (this fallback may be removed in a future Go release).

上記にある通り、GOEXPERIMENT=nodwarf5 を指定してビルドするとDWARF4になるみたいです。注意点として、将来このフラグは消える可能性があるとのこと。

Go1.25とGo1.26では、まだ有効です。

試してみる

main.go

package main

func main() {

}

Taskfile.yml

# yaml-language-server: $schema=https://taskfile.dev/schema.json

version: '3'

vars:
  DWARF5: app_dwarf5
  DWARF4: app_dwarf4

tasks:
  default:
    cmds:
      - task: build-dwarf5
      - task: build-dwarf4
      - task: check-dwarf-version
  build-dwarf5:
    cmds:
      #
      # Go 1.25以降は DWARF5 がデフォルトとなっている
      #
      # とても古いバージョンの gdb (例:CentOS8 など) では
      # DWARF5形式に対応していないので、gdb利用時に以下のエラーメッセージが表示される。
      #
      # Dwarf Error: Cannot handle DW_FORM_addrx in DWARF reader [in module libXXXX.so]
      # 
      # 上記のメッセージが出た場合はDWARF5形式に対応していない。
      # (DW_FORM_addrx は、DWARF5から追加された)
      #
      # - https://go.dev/doc/go1.25
      # - https://github.com/golang/go/issues/75079
      #
      - go build -o {{.DWARF5}} main.go
  build-dwarf4:
    env:
      #
      # Go 1.25以降で、強制的に DWARF4 を適用するには
      # GOEXPERIMENT="nodwarf5" を指定する。
      # 
      # - https://go.dev/doc/go1.25
      # - https://github.com/golang/go/issues/75079
      #
      GOEXPERIMENT: "nodwarf5"
    cmds:
      - go build -o {{.DWARF4}} main.go
  check-dwarf-version:
    cmds:
      #
      # .debug_addr セクションは DWARF5 固有のセクションであるため、
      # その有無により DWARF バージョンを判別できる。
      #
      #   存在する   -> DWARF5
      #   存在しない -> DWARF4 以下
      #
      - readelf -S {{.DWARF5}} | grep debug_addr
      - readelf -S {{.DWARF4}} | grep debug_addr
    ignore_error: true

実行結果

$ task
task: [build-dwarf5] go build -o app_dwarf5 main.go
task: [build-dwarf4] go build -o app_dwarf4 main.go
task: [check-dwarf-version] readelf -S app_dwarf5 | grep debug_addr
  [22] .debug_addr       PROGBITS         0000000000000000  001a42c8
task: [check-dwarf-version] readelf -S app_dwarf4 | grep debug_addr

ちゃんと GOEXPERIMENT=nodwarf5 を付与した版はDWARF4になってますね。

参考情報

go.dev

github.com

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。




以上の内容はhttps://devlights.hatenablog.com/entry/2026/03/13/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14