代码之家  ›  专栏  ›  技术社区  ›  Bosz

如何使用python ctypes定义未定义的符号

  •  3
  • Bosz  · 技术社区  · 7 年前

    我想使用一个共享库(带有python ctypes),它期望在使用该共享库的程序中定义一些符号。

    在以下示例中, var 定义于 test.c 虽然 nm libadd.so 表明 风险值 未定义;

    /* 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
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Bosz    7 年前

    一种可能性是创建一个单独的共享库来定义 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)