golang怎么解析第三方公司提供的c语言的so文件?

我看大多数解析C语言动态库都是用的C包,但这个包需要用到.h文件。现在只有so文件,能不能向python的ctype包那样直接加载so文件?

阅读 4.4k
1 个回答

你需要知道如何调用那个 so 文件的(输出)接口,这个通常在 SDK 文档或 .h 头文件中描述。

知道调用方法了,若 *.h 文件缺失,可透过一些命令查出 so 文件的输出接口(函数),如

nm -D --defined-only xxx.so

或逆向工程解析出接口(及参数)。


举个例子,演示如何调用 libadder.soint add(int a, int b) 接口函数。

文件结构

├── main.go            // 调用接口函数
└── shared-lib
    ├── adder.c        // so 功能实现
    ├── adder.h
    ├── libadder.so    // 由 Makefile 生成
    └── Makefile

文件内容

adder.h

#ifndef _ADDER_H_
#define _ADDER_H_

int add(int a, int b);

#endif

adder.c

int add(int a, int b)
{
    return a + b;
}

Makefile

libadder.so: adder.c
    gcc -shared -Wall -O2 -std=c11 -fPIC -o $@ $^

main.go

package main

/*
#cgo CFLAGS: -Ishared-lib/
#cgo LDFLAGS: -Lshared-lib/ -ladder
#include <adder.h>
*/
import "C"
import "fmt"

func main() {
    fmt.Println("1 + 2 = ", C.add(1, 2))
}

编译使用

  1. 生成 so 文件: make -C shared-lib
  2. 运行 go 文件: LD_LIBRARY_PATH=$(pwd)/shared-lib go run main.go
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题