go 1.20后關(guān)于 go tool compile匯編代碼引入包找不到的問題處理
今天準(zhǔn)備跟大家講解關(guān)于interface的 帶方法的非空接口 和 不帶方法的空接口;
看一下匯編代碼中的深層數(shù)據(jù)結(jié)構(gòu);
回家執(zhí)行:
go tool compile -S interface2.go

發(fā)現(xiàn)虛擬機(jī)中命令行報(bào)錯(cuò):

我就很納悶兒,我在公司是沒問題的,因此我google找一些大佬看下問題;


的問題;
知道了編譯過程中fmt這個(gè)包會(huì)編譯成一個(gè)靜態(tài)庫文件.a
這樣我就專門寫了一個(gè)引用 fmt包的go文件進(jìn)行g(shù)o build 查看其編譯過程;
go build -x -v -a myA.go 2>&1 | more > br.txt
將myA.go文件進(jìn)行編譯查看其編譯過程,導(dǎo)入到br.txt文件中
package main
import "fmt"
func main() {
? ?fmt.Println(1)
}
找到文件中編譯過程中的fmt包編譯過程:
/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b002/_pkg_.a -trimpath "$WORK/b002=>" -p fmt -std -complete -buildid S7VmaYzQ3wdSCzOFapTF/S7VmaYzQ3wdSCzOFapTF -goversion go1.20.3 -nolocalimports -importcfg $WORK/b002/importcfg -pack /usr/local/go/src/fmt/doc.go /usr/local/go/src/fmt/errors.go /usr/local/go/src/fmt/format.go /usr/local/go/src/fmt/print.go /usr/local/go/src/fmt/scan.go
將其改成我自己手動(dòng)執(zhí)行的:
/usr/local/go/pkg/tool/linux_amd64/compile -o pkg.a -p fmt -std -complete -buildid S7VmaYzQ3wdSCzOFapTF/S7VmaYzQ3wdSCzOFapTF -goversion go1.20.3 -nolocalimports -pack /usr/local/go/src/fmt/doc.go /usr/local/go/src/fmt/errors.go /usr/local/go/src/fmt/format.go /usr/local/go/src/fmt/print.go /usr/local/go/src/fmt/scan.go
發(fā)現(xiàn)不行報(bào)錯(cuò):

發(fā)現(xiàn)包還會(huì)引用更多的包,因此直接找編譯生成好的.a文件直接用;
找到了這一行:

直接到:
/root/.cache/go-build/b7/
這個(gè)路徑下找,還真找到了這個(gè)文件;

將這個(gè)文件拷貝到,我們需要匯編的文件夾:

創(chuàng)建 fmt包替換文件:
importcfg.txt 內(nèi)容:
packagefile fmt=fmt.a
之后直接進(jìn)行匯編:
go tool compile -p twzz -importcfg importcfg.txt interface2.go
生成了.o的匯編文件;我們就可以通過指令查看我們需要的匯編代碼了:
go tool objdump -S -s "^twzz.p3e$" interface2.o
我們?nèi)绻枰约旱膮R編代碼:
go tool compile -p foo -o foo.a -importcfg importcfg.txt foo.go
網(wǎng)址:
Go1.20編譯靜態(tài)庫過程記錄
https://blog.csdn.net/baixvkwfn/article/details/128942195
golang中生成靜態(tài)庫(.a文件)并操作靜態(tài)庫
https://blog.csdn.net/huha666/article/details/121305696