golang cgo не может экспортировать переменные в режиме сборки c-shared

Я пытаюсь разработать в cgo плагин sudo.

https://www.sudo.ws/man/1.8.15/sudo_plugin.man.html

экспортировать структуру в глобальную область применения policy_plugin.

Плагин политики должен объявлять и заполнять структуру policy_plugin в глобальной области видимости.

У вас есть объяснение, что это значит?

export_test.go

package main

/*
#include "sudo_plugin.h"
#include <stddef.h>
*/
import "C"

func main() {
}

// don't worked
//export policy
var policy = &C.struct_policy_plugin{
    C.SUDO_POLICY_PLUGIN,
    C.SUDO_API_VERSION,
    nil,
    nil,
    nil,
    nil,
    nil,
    nil,
    nil,
    nil,
    nil,
    nil,
}

person Kazuhiko Yamashita    schedule 25.03.2016    source источник


Ответы (1)


Похоже, что режим сборки c-shared экспортирует только записи функций, а не переменные. Хотя в дизайн-документе это не указано явно, в нем также не говорится о переменных.

В cmd/cgo руководстве переменные явно не упоминаются, но, похоже, подразумевается, что специальные //export ... комментарии относятся только к функциям. .

Предположительно, вы могли бы объявить свою внешнюю переменную на стороне C после определения и отображения необходимых функций Go, например:

"callbacks.go":

package main

import "C"

//export real_fn
func real_fn(x C.int) C.int {
    return 42
}

"main.go":

package main

/*
typedef struct {
    int x;
    int (*fn) (int x);
} foo;

extern int real_fn(int);

foo xyzzy = {
    0,
    real_fn,
};
*/
import "C"

func main() {
}

Теперь после запуска go build -buildmode=c-shared вы можете изучить сгенерированную библиотеку и увидеть доступный там символ xyzzy:

cshared% nm -g cshared | grep -E 'xyzzy|real_fn'
0000000000061330 T _cgoexp_4f8dd74b8333_real_fn
00000000000b42c0 T real_fn
00000000003274d0 D xyzzy

Примечание: если вы собираетесь использовать обратные вызовы, вы должны поместить их в отдельный файл (или файлы), это похоже на причуду cgo.

person kostix    schedule 25.03.2016
comment
Спасибо, пожалуйста, ответьте. Я не думал о таком методе. Я буду стараться! - person Kazuhiko Yamashita; 25.03.2016