Golang中如何创建静态链接的SO文件
Golang中如何创建静态链接的SO文件 我正在尝试为Go包创建一个静态链接的.so文件。
go install -v --ldflags=-d -linkmode external --tags=purego netgo with_embed package_name
它生成了 package_name.a。我想创建 package_name.so,并且它应该是静态链接的。有人能提供建议吗?
.a 文件是静态链接库。.so 文件是动态链接库。
更多关于Golang中如何创建静态链接的SO文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
静态库(.a)和静态链接之间存在区别。
ldd static_library.a 的输出是 “not a dynamic executable”
ldd libname.so 的输出是 statically linked
我正在尝试第二种方式,它可以在运行时由进程加载。
如果我对 .a 文件进行对象转储,则会报错: objdump: __.PKGDEF: 无法识别的文件格式 objdump: go.o: 无法识别的文件格式
我正在尝试创建一个库文件,期望 ldd libname 能显示其为静态链接,并且 objdump 能对其正常工作。
ldd static_library.a 输出“不是动态可执行文件”。
ldd libname.so 输出静态链接。
objdump 对 libname.so 有效,对 static_library.a 无效。
dlopen 对 libname.so 有效,对 static_library.a 无效。
我认为这有所不同。你创建了一个使用 c-shared 的 so 文件
ldd libso.so 应该会打印
静态链接
对 libso 使用 objdump 也应该有效。
如果我使用以下命令创建一个二进制文件
go install -v --ldflags ‘-w -d -linkmode internal’ --tags ‘purego netgo with_embed’ mainpackage
ldd binaryname 会打印“not a dynamic executable”,并且 objdump 对它也有效。
在Go中创建静态链接的.so文件需要明确指定构建模式和链接方式。以下是两种可行的方法:
方法1:使用c-shared构建模式
// 先确保CGO_ENABLED=1
CGO_ENABLED=1 go build -buildmode=c-shared -o package_name.so ./package_name
// 如果需要静态链接所有依赖,添加ldflags
CGO_ENABLED=1 go build -buildmode=c-shared -ldflags="-extldflags=-static" -o package_name.so ./package_name
方法2:使用c-archive然后转换为.so
// 首先创建静态库
CGO_ENABLED=1 go build -buildmode=c-archive -o package_name.a ./package_name
// 使用gcc将.a转换为.so
gcc -shared -pthread -o package_name.so package_name.a -static
方法3:完整的静态链接示例
// 创建完全静态链接的.so文件
CGO_ENABLED=1 go build \
-buildmode=c-shared \
-ldflags="-extldflags=-static -linkmode=external" \
-tags="netgo static_build" \
-o package_name.so \
./package_name
验证.so文件链接类型
# 检查是否为静态链接
file package_name.so
ldd package_name.so # 应该显示"not a dynamic executable"
readelf -d package_name.so | grep NEEDED
注意事项
- 确保系统安装了静态C库(如glibc-static)
- 某些平台可能需要额外的链接器标志
- 如果遇到链接错误,可能需要指定特定的C库路径
# 在Linux上安装必要的静态库
sudo apt-get install libc6-dev glibc-static # Debian/Ubuntu
sudo yum install glibc-static # RHEL/CentOS
使用这些方法可以生成静态链接的.so文件,其中所有依赖都包含在单个文件中。


