这是对此问题的后续问题:Minimal example of Python interpreter embedding segfaults。
当我编译这样的程序时:
gcc -fno-diagnostics-color -Wall -Wno-unused-function \
-I. -fPIC -g3 -shared -I/usr/include/python3.5m \
-I/usr/include/python3.5m -Wno-unused-result \
-Wsign-compare -g \
-fdebug-prefix-map=/build/python3.5-nLrllb/python3.5-3.5.3=. \
-fstack-protector-strong -Wformat -Werror=format-security \
-DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes \
-L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -L/usr/lib \
-lpython3.5m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic \
-Wl,-O1 -Wl,-Bsymbolic-functions ./main.o ./binparser.o \
-o protopy
大量选项是由于运行:
/usr/bin/python3.5-config --cflags
和/usr/bin/python3.5-config --ldconfig
并尝试将它们合并到构建中(-fPIC
似乎是强制性的,没有-shared
它不会链接,因为,我认为,这是你可以链接Python库的唯一方法。
当我在GDB中运行已编译的程序时,main()
始终没有参数。无论我是r foo bar
还是set args foo bar
。
有什么想法吗?我不知道这里所有的gcc选项是做什么的,所以,也许是其中的一些?
答案 0 :(得分:1)
期望gdb
在被调用的共享对象中设置有意义的断点是不合理的,就像它是可执行文件一样。如果对the linked question中所述构建的二进制文件使用strace
,则在使用时通常会在动态链接器中看到任何系统调用之前,您会立即看到段错误strace
关于真正的可执行文件。