Golang中如何创建共享库并让ldd输出静态链接结果

Golang中如何创建共享库并让ldd输出静态链接结果 我想在Go语言中创建一个共享库,当我们尝试使用ldd soname.so命令时,输出结果应为"statically linked"。 能否建议如何构建共享库以获得此输出。

1 回复

更多关于Golang中如何创建共享库并让ldd输出静态链接结果的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中创建共享库并让ldd输出"statically linked"的关键是使用-ldflags="-s -w -linkmode=external -extldflags=-static"构建标志。以下是具体实现方法:

// 创建共享库的示例代码
package main

import "C"

//export Add
func Add(a, b int) int {
    return a + b
}

func main() {
    // 共享库不需要main函数执行逻辑
}

构建命令:

# 设置CGO_ENABLED=1并使用静态链接标志
CGO_ENABLED=1 go build -buildmode=c-shared -o libexample.so \
-ldflags="-s -w -linkmode=external -extldflags=-static" \
main.go

验证结果:

$ ldd libexample.so
    statically linked

重要说明:

  1. 必须启用CGOCGO_ENABLED=1是必需的,因为纯Go构建默认使用内部链接器
  2. 链接模式设置-linkmode=external强制使用外部链接器
  3. 静态链接标志-extldflags=-static指示外部链接器进行静态链接
  4. 依赖处理:确保系统安装了静态C库(如libc.a

如果遇到链接错误,可能需要安装静态库:

# Ubuntu/Debian
sudo apt-get install libc6-dev

# 或者明确安装静态版本
sudo apt-get install libc6-dev-static

这种方法生成的共享库会将所有依赖静态链接,因此ldd会显示"statically linked"。注意这会显著增加文件大小,因为所有依赖都被包含在单个文件中。

回到顶部