Golang中国

test_so.c 源文件

#include <stdio.h>
void phxencrypt(char *str)
{
    printf("%s\n", &str);
}

gcc -shared -o test_so.so test_so.c -fpic

编译成so动态库调用

package main

/*
#include <dlfcn.h>
#include <stdio.h>
#cgo LDFLAGS: -ldl

void (*phxencrypt)(char);

void set_phx(void* fn) {
    phxencrypt = fn;
}

void call_phx(char *str) {
    printf("%s\n", str);
    phxencrypt(*str);
}
*/
import "C"

func main() {
    hd := C.dlopen(C.CString("./test_so.so"), C.RTLD_LAZY)
    if hd == nil {
        panic("dlopen")
    }
    phx := C.dlsym(hd, C.CString("phxencrypt"))
    if phx == nil {
        panic("dlsym")
    }
    C.set_phx(phx)
    cs :=C.CString("test")
    C.call_phx(cs)
}

执行结果

go run test.go
test
t

请教大家,为什么执行后,通过动态库传参,只打印出第一个字符,而不是整个字符串?


ivan 于 2015-09-26 18:33 修改
2 回复
xuhany
#1 xuhany • 2015-09-26 18:56

如下:

  1. test_so.c

    #include <stdio.h>
    void phxencrypt(char *str) //this
    {
      printf("%s\n", str); //this
    }
    

    gcc -shared -o test_so.so test_so.c -fpic

  2. test.go

    package main
    /*
    #include <dlfcn.h>
    #include <stdio.h>
    #cgo LDFLAGS: -ldl
    void (*phxencrypt)(char*); //this
    void set_phx(void* fn) {
        phxencrypt = fn;
    }
    void call_phx(char *str) {
        printf("%s\n", str);
        phxencrypt(str); //this
    }
    */
    import "C"
    func main() {
        hd := C.dlopen(C.CString("./test_so.so"), C.RTLD_LAZY)
        if hd == nil {
            panic("dlopen")
        }
        phx := C.dlsym(hd, C.CString("phxencrypt"))
        if phx == nil {
            panic("dlsym")
        }
        C.set_phx(phx)
        cs :=C.CString("test")
        C.call_phx(cs)
    }
    

    go run test.go

运行效果:

alt

ivan
#2 ivan • 2015-09-26 22:45

问题解决了,谢谢

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。