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,并且它应该是静态链接的。有人能提供建议吗?

7 回复

.a 文件是静态链接库。.so 文件是动态链接库。

更多关于Golang中如何创建静态链接的SO文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


ManojKumarChauhan:

静态库(.a)和静态链接之间存在区别。

有什么区别?

静态库(.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 输出静态链接。 objdumplibname.so 有效,对 static_library.a 无效。 dlopenlibname.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

注意事项

  1. 确保系统安装了静态C库(如glibc-static)
  2. 某些平台可能需要额外的链接器标志
  3. 如果遇到链接错误,可能需要指定特定的C库路径
# 在Linux上安装必要的静态库
sudo apt-get install libc6-dev glibc-static  # Debian/Ubuntu
sudo yum install glibc-static                # RHEL/CentOS

使用这些方法可以生成静态链接的.so文件,其中所有依赖都包含在单个文件中。

回到顶部