Python(c)源代码如何编译成共享库

时间:2017-04-17 03:05:54

标签: python c python-2.7

在Python 2.7 README文件中,它说

  

从Python 2.3开始,可以构建大部分解释器   到共享库,然后解释器可以使用它   可执行

我想知道pystate.c中的以下全局变量是否已编译到共享库或可执行文件中?

static PyInterpreterState *interp_head = NULL;

PyThreadState *_PyThreadState_Current = NULL;

顺便说一句,如果将这样的全局(静态)变量编译到共享库中,这些状态是否会在不同的python进程之间共享?例如,pCryptGenRandom

中的random.c

1 个答案:

答案 0 :(得分:1)

两个符号都出现在共享库的零初始化段中:

% nm /usr/lib/x86_64-linux-gnu/libpython2.7_d.so|egrep '(interp_head|_PyThreadState_Current)'
000000000062a230 b interp_head
000000000062a208 B _PyThreadState_Current

interp_head是一个静态变量 - 没有外部链接的变量 - 在模块外部不可见。 _PyThreadState_Current具有外部链接,并且使用共享库对程序可见:

% objdump -TC /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 | \
   egrep 'interp_head|_PyThreadState_Current'
000000000056d3c0 g    DO .bss   0000000000000008  Base        _PyThreadState_Current

(外部符号表中仅列出_PyThreadState_Current)。

每个进程都有一组单独的全局变量;这些不在Python进程之间共享。