👻

`-no_pie is deprecated when targeting new OS versions`エラーに遭遇して解決した話

2023/03/13に公開

結論

Go言語のバージョンを1.17から1.20に上げると解決しました。(1.181.19でも良さそう)

はじめに

私が携わっているプロジェクトでは、oapi-codegenを使ってOpenAPIクライアントとコードの自動生成を行っているのですが、ある日突然エラーが出て失敗するようになってしまいました。

ld: warning: -no_pie is deprecated when targeting new OS versions

エラーメッセージにはtargeting new OS versionsと書いてあるものの、OSやその他のバージョンを変更した覚えはありません。
当時の環境はこんな感じです。

- macOS:Monterey
- プロセッサ:Intel
- Go言語のバージョン:1.17.0 darwin/amd64
- XCodeのバージョン:覚えていないけど、最新じゃなかった

試したこと

Xcodeをアップデート:関係なし

インストールに時間がかかるXcodeのアップデートはついサボってしまいがちだったので、コイツが原因かと思い最新版(14.2)にアップデートしてみましたが、エラーは解決しませんでした。

macOSのアップデート:関係なし

ついでにmacOSをVenturaにアップデートしてみましたが、これも関係なし。関係ないだろうとは思っていたので予想通りです。

Go言語のアップデート:解決!

エラーメッセージでググっていたところ、Go言語を1.18 or 1.19に上げると解決したとの情報を見つけました。プロジェクトのGo言語は1.17だったのですが、プログラムに影響がないことを確認した上で1.20にあげてみたところ、例のエラーがでなくなり無事解決しました。

Go言語のバージョンを上げる以外に、ビルド時に-buildmode=pieフラグをつけることが解決法として挙げられていましたが、oapi-codegenのコマンドに-buildmode=pieは使用できなさそうでした。その他にも古いバージョンのリンカーを使用するなども挙げられていましたが、プロジェクトに影響がないのであればGo言語のバージョンを上げてしまうのが一番手っ取り早そうです。
https://github.com/golang/go/issues/54482

おまけ:Go言語のバージョンの上げ方

備忘録としてGo言語のバージョンの上げ方を書き残します。

1. goenv install -lで最新版を確認

goenv install -lして出てきたものがこちら

 $ goenv install -l
 Available versions:
 1.2.2
 .
 .
 .
 1.17rc2

1.17で止まってました。Go言語のバージョンを上げる前にgoenvのバージョンをあげないといけないようです。

https://zenn.dev/utah/articles/b48482864a1e8f

2. anyenv-updateでgoenvをアップデート

私はanyenvを使用しているのでgoenvをアップデートするには anyenv updateすれば良いようです。

$ anyenv update
anyenv: no such command `update'

どうやらanyenv-updateというプラグインが必要だったようなので導入します。

$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

再度 anyenv updateしてからgoenv install -lしてみます。

 $ goenv install -l
 Available versions:
  1.2.2
  .
  .
  .
  1.20.1

goenvがアップデートされて1.20が選べるようになりました。

3. Go言語の最新版をインストール

ようやくGo言語の最新版をインストールできます。

 $ goenv install 1.20.0
 $ goenv global 1.20.0
 $ goenv versions
   1.17.0
 * 1.20.0 (set by /Users/***/.anyenv/envs/goenv/version)

あとはGOROOTまたはGOPATH、go modなどを最新のGo言語バージョンに合わせたら無事完了です!

レスキューナウテックブログ

Discussion