如何使用 python ctypes 定义一个未定义的符号
How to use python ctypes to define an undefined symbol
我想使用共享库(带有 python ctypes),它希望在使用该共享库的程序中定义一些符号。
在下面的例子中,var
定义在test.c
,而nm libadd.so
表示var
未定义;
/* libadd.c */
#include <stdio.h>
extern int var;
int add(int a, int b) {
return (a + b + var);
}
gcc -c -Wall -Werror -fpic libadd.c
gcc -shared -o libadd.so libadd.o
/* test.c */
#include <stdio.h>
#include "libadd.h"
int var = 1;
int main(void) {
printf("%d", add(1,2));
return 0;
}
gcc -L/path/to/libadd -Wall -o test test.c -ladd
同样,如何使用 python ctypes 做到这一点;
# test.py
from ctypes import *
#what to do to define var?
sharedlib = CDLL("sharedlib/libadd.so", mode = RTLD_GLOBAL)
print( sharedlib.add(1,2) )
OSError: sharedlib/libadd.so: undefined symbol: var
一种可能性是创建一个单独的共享库来定义 var
并在 libadd.so
之前加载它。
/* resolve.c */
int var = 1;
gcc -c -Wall -Werror -fpic resolve.c
gcc -shared -o resolve.so resolve.o
from ctypes import *
sharedlib = CDLL("sharedlib/resolve.so", mode = RTLD_GLOBAL)
sharedlib = CDLL("sharedlib/libadd.so", mode = RTLD_GLOBAL)
我想使用共享库(带有 python ctypes),它希望在使用该共享库的程序中定义一些符号。
在下面的例子中,var
定义在test.c
,而nm libadd.so
表示var
未定义;
/* libadd.c */
#include <stdio.h>
extern int var;
int add(int a, int b) {
return (a + b + var);
}
gcc -c -Wall -Werror -fpic libadd.c
gcc -shared -o libadd.so libadd.o
/* test.c */
#include <stdio.h>
#include "libadd.h"
int var = 1;
int main(void) {
printf("%d", add(1,2));
return 0;
}
gcc -L/path/to/libadd -Wall -o test test.c -ladd
同样,如何使用 python ctypes 做到这一点;
# test.py
from ctypes import *
#what to do to define var?
sharedlib = CDLL("sharedlib/libadd.so", mode = RTLD_GLOBAL)
print( sharedlib.add(1,2) )
OSError: sharedlib/libadd.so: undefined symbol: var
一种可能性是创建一个单独的共享库来定义 var
并在 libadd.so
之前加载它。
/* resolve.c */
int var = 1;
gcc -c -Wall -Werror -fpic resolve.c
gcc -shared -o resolve.so resolve.o
from ctypes import *
sharedlib = CDLL("sharedlib/resolve.so", mode = RTLD_GLOBAL)
sharedlib = CDLL("sharedlib/libadd.so", mode = RTLD_GLOBAL)