From 8657fbd810b8bd3fc98cd9752bcc6be5d944e4fa Mon Sep 17 00:00:00 2001 From: xushiwei Date: Mon, 15 Jul 2024 14:55:00 +0800 Subject: [PATCH 1/2] xtool: llvm InstallNameTool --- xtool/env/llvm/llvm.go | 6 +++ xtool/llvm/install_name_tool/rpath.go | 56 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 xtool/llvm/install_name_tool/rpath.go diff --git a/xtool/env/llvm/llvm.go b/xtool/env/llvm/llvm.go index 06fc35c1..82d0d13e 100644 --- a/xtool/env/llvm/llvm.go +++ b/xtool/env/llvm/llvm.go @@ -23,6 +23,7 @@ import ( "strings" "github.com/goplus/llgo/xtool/clang" + "github.com/goplus/llgo/xtool/llvm/install_name_tool" "github.com/goplus/llgo/xtool/llvm/llvmlink" "github.com/goplus/llgo/xtool/nm" ) @@ -87,4 +88,9 @@ func (e *Env) Nm() *nm.Cmd { return nm.New(bin) } +func (e *Env) InstallNameTool() *install_name_tool.Cmd { + bin := filepath.Join(e.BinDir(), "llvm-install-name-tool") + return install_name_tool.New(bin) +} + // ----------------------------------------------------------------------------- diff --git a/xtool/llvm/install_name_tool/rpath.go b/xtool/llvm/install_name_tool/rpath.go new file mode 100644 index 00000000..c1cdfccb --- /dev/null +++ b/xtool/llvm/install_name_tool/rpath.go @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package install_name_tool + +import ( + "io" + "os/exec" +) + +// Cmd represents a install_name_tool command. +type Cmd struct { + app string + + Stdout io.Writer + Stderr io.Writer +} + +// New creates a new install_name_tool command. +func New(app string) *Cmd { + if app == "" { + app = "install_name_tool" + } + return &Cmd{app: app} +} + +type Change struct { + Old string + New string +} + +// Change changes dependent shared library install name. +func (p *Cmd) Change(dylib string, chgs ...Change) error { + args := make([]string, len(chgs)*3+1) + for _, chg := range chgs { + args = append(args, "-change", chg.Old, chg.New) + } + args = append(args, dylib) + cmd := exec.Command(p.app, args...) + cmd.Stdout = p.Stdout + cmd.Stderr = p.Stderr + return cmd.Run() +} From 93bac6f26fe22fe1cf534ce6b94c22deba8a79b9 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Mon, 15 Jul 2024 15:02:29 +0800 Subject: [PATCH 2/2] install_name_tool: ChangeToRpath --- xtool/llvm/install_name_tool/rpath.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/xtool/llvm/install_name_tool/rpath.go b/xtool/llvm/install_name_tool/rpath.go index c1cdfccb..744d196c 100644 --- a/xtool/llvm/install_name_tool/rpath.go +++ b/xtool/llvm/install_name_tool/rpath.go @@ -19,6 +19,7 @@ package install_name_tool import ( "io" "os/exec" + "path/filepath" ) // Cmd represents a install_name_tool command. @@ -37,20 +38,30 @@ func New(app string) *Cmd { return &Cmd{app: app} } +// Change represents a dependent shared library install name change. type Change struct { Old string New string } // Change changes dependent shared library install name. -func (p *Cmd) Change(dylib string, chgs ...Change) error { +func (p *Cmd) Change(target string, chgs ...Change) error { args := make([]string, len(chgs)*3+1) for _, chg := range chgs { args = append(args, "-change", chg.Old, chg.New) } - args = append(args, dylib) + args = append(args, target) cmd := exec.Command(p.app, args...) cmd.Stdout = p.Stdout cmd.Stderr = p.Stderr return cmd.Run() } + +// ChangeToRpath changes dependent shared library install name to @rpath. +func (p *Cmd) ChangeToRpath(target string, dylibDeps ...string) error { + chgs := make([]Change, len(dylibDeps)) + for i, dep := range dylibDeps { + chgs[i] = Change{Old: dep, New: "@rpath/" + filepath.Base(dep)} + } + return p.Change(target, chgs...) +}