You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2026/10/20 19:30:34 UTC
(mynewt-newt) 04/15: newt/toolchain: Derive nm and addr2line path from objdump.exe
This is an automated email from the ASF dual-hosted git repository.
sjanc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git
commit 87c6c26c5296319cc8ea16443630df96982cec61
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Mon Oct 19 17:47:43 2026 +0200
newt/toolchain: Derive nm and addr2line path from objdump.exe
If compiler.path.nm or compiler.path.addr2line is not set, the path
is derived from compiler.path.objdump, but only if it ends with
"objdump". On Windows, "arm-none-eabi-objdump.exe" fell back to
"arm-none-eabi-nm". Handle the ".exe" suffix too.
Assisted-by: Claude:claude-opus-5-5
---
newt/toolchain/compiler.go | 6 ++++--
newt/toolchain/toolpath_test.go | 47 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/newt/toolchain/compiler.go b/newt/toolchain/compiler.go
index f22f671e..067aee5f 100644
--- a/newt/toolchain/compiler.go
+++ b/newt/toolchain/compiler.go
@@ -157,8 +157,10 @@ func (c *Compiler) GetAddr2linePath() string {
// Returns path of binutils tool with given name that belongs to the same
// toolchain as objdump, e.g. arm-none-eabi-objdump -> arm-none-eabi-nm.
func siblingToolPath(odPath string, tool string) string {
- if strings.HasSuffix(odPath, "objdump") {
- return strings.TrimSuffix(odPath, "objdump") + tool
+ for _, ext := range []string{"", ".exe"} {
+ if strings.HasSuffix(odPath, "objdump"+ext) {
+ return strings.TrimSuffix(odPath, "objdump"+ext) + tool + ext
+ }
}
return "arm-none-eabi-" + tool
diff --git a/newt/toolchain/toolpath_test.go b/newt/toolchain/toolpath_test.go
new file mode 100644
index 00000000..5e8d451d
--- /dev/null
+++ b/newt/toolchain/toolpath_test.go
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 toolchain
+
+import "testing"
+
+func TestSiblingToolPath(t *testing.T) {
+ tests := []struct {
+ odPath string
+ tool string
+ exp string
+ }{
+ {"arm-none-eabi-objdump", "nm", "arm-none-eabi-nm"},
+ {"/opt/gcc/bin/riscv-none-embed-objdump", "addr2line",
+ "/opt/gcc/bin/riscv-none-embed-addr2line"},
+ {"objdump", "nm", "nm"},
+ {"gobjdump", "nm", "gnm"},
+ {`C:\gcc\bin\arm-none-eabi-objdump.exe`, "nm",
+ `C:\gcc\bin\arm-none-eabi-nm.exe`},
+ {"", "nm", "arm-none-eabi-nm"},
+ }
+
+ for _, tt := range tests {
+ got := siblingToolPath(tt.odPath, tt.tool)
+ if got != tt.exp {
+ t.Errorf("siblingToolPath(%q, %q) = %q, expected %q",
+ tt.odPath, tt.tool, got, tt.exp)
+ }
+ }
+}