浏览代码

Add support for LLVM nm. (#545)

Garrett Wang 4 年前
父节点
当前提交
d500996d7c
没有帐户链接到提交者的电子邮件
共有 1 个文件被更改,包括 27 次插入9 次删除
  1. 27
    9
      internal/binutils/binutils.go

+ 27
- 9
internal/binutils/binutils.go 查看文件

@@ -137,14 +137,12 @@ func initTools(b *binrep, config string) {
137 137
 	}
138 138
 
139 139
 	defaultPath := paths[""]
140
-	b.llvmSymbolizer, b.llvmSymbolizerFound = findExe("llvm-symbolizer", append(paths["llvm-symbolizer"], defaultPath...))
141
-	b.addr2line, b.addr2lineFound = findExe("addr2line", append(paths["addr2line"], defaultPath...))
142
-	if !b.addr2lineFound {
143
-		// On MacOS, brew installs addr2line under gaddr2line name, so search for
144
-		// that if the tool is not found by its default name.
145
-		b.addr2line, b.addr2lineFound = findExe("gaddr2line", append(paths["addr2line"], defaultPath...))
146
-	}
147
-	b.nm, b.nmFound = findExe("nm", append(paths["nm"], defaultPath...))
140
+	b.llvmSymbolizer, b.llvmSymbolizerFound = chooseExe([]string{"llvm-symbolizer"}, []string{}, append(paths["llvm-symbolizer"], defaultPath...))
141
+	b.addr2line, b.addr2lineFound = chooseExe([]string{"addr2line"}, []string{"gaddr2line"}, append(paths["addr2line"], defaultPath...))
142
+	// The "-n" option is supported by LLVM since 2011. The output of llvm-nm
143
+	// and GNU nm with "-n" option is interchangeable for our purposes, so we do
144
+	// not need to differrentiate them.
145
+	b.nm, b.nmFound = chooseExe([]string{"llvm-nm", "nm"}, []string{"gnm"}, append(paths["nm"], defaultPath...))
148 146
 	b.objdump, b.objdumpFound, b.isLLVMObjdump = findObjdump(append(paths["objdump"], defaultPath...))
149 147
 }
150 148
 
@@ -155,7 +153,7 @@ func initTools(b *binrep, config string) {
155 153
 // a string with path to the preferred objdump binary if found,
156 154
 // or an empty string if not found;
157 155
 // a boolean if any acceptable objdump was found;
158
-// a boolen indicating if it is an LLVM objdump.
156
+// a boolean indicating if it is an LLVM objdump.
159 157
 func findObjdump(paths []string) (string, bool, bool) {
160 158
 	objdumpNames := []string{"llvm-objdump", "objdump"}
161 159
 	if runtime.GOOS == "darwin" {
@@ -179,6 +177,26 @@ func findObjdump(paths []string) (string, bool, bool) {
179 177
 	return "", false, false
180 178
 }
181 179
 
180
+// chooseExe finds and returns path to preferred binary. names is a list of
181
+// names to search on both Linux and OSX. osxNames is a list of names specific
182
+// to OSX. names always has a higher priority than osxNames. The order of
183
+// the name within each list decides its priority (e.g. the first name has a
184
+// higher priority than the second name in the list).
185
+//
186
+// It returns a string with path to the binary and a boolean indicating if any
187
+// acceptable binary was found.
188
+func chooseExe(names, osxNames []string, paths []string) (string, bool) {
189
+	if runtime.GOOS == "darwin" {
190
+		names = append(names, osxNames...)
191
+	}
192
+	for _, name := range names {
193
+		if binary, found := findExe(name, paths); found {
194
+			return binary, true
195
+		}
196
+	}
197
+	return "", false
198
+}
199
+
182 200
 // isLLVMObjdump accepts a string with path to an objdump binary,
183 201
 // and returns a boolean indicating if the given binary is an LLVM
184 202
 // objdump binary of an acceptable version.