鍍金池/ 問答/GO/ golang怎么解析第三方公司提供的c語言的so文件?

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

我看大多數(shù)解析C語言動態(tài)庫都是用的C包,但這個(gè)包需要用到.h文件。現(xiàn)在只有so文件,能不能向python的ctype包那樣直接加載so文件?

回答
編輯回答
空白格

你需要知道如何調(diào)用那個(gè) so 文件的(輸出)接口,這個(gè)通常在 SDK 文檔或 .h 頭文件中描述。

知道調(diào)用方法了,若 *.h 文件缺失,可透過一些命令查出 so 文件的輸出接口(函數(shù)),如

nm -D --defined-only xxx.so

或逆向工程解析出接口(及參數(shù))。


舉個(gè)例子,演示如何調(diào)用 libadder.soint add(int a, int b) 接口函數(shù)。

文件結(jié)構(gòu)

├── main.go            // 調(diào)用接口函數(shù)
└── shared-lib
    ├── adder.c        // so 功能實(shí)現(xiàn)
    ├── adder.h
    ├── libadder.so    // 由 Makefile 生成
    └── Makefile

文件內(nèi)容

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. 運(yùn)行 go 文件: LD_LIBRARY_PATH=$(pwd)/shared-lib go run main.go
2017年4月17日 04:22