I'm trying to import
and run this python function inside C code:
import requestsimport jsonurl = 'http://127.0.0.1:5000/'def verify(): code = input('Show-me the code: ') r = requests.post(url, data=json.dumps({'code': code})) return r.json()
Here is the C code:
#include <Python.h>int main(void){ PyObject *myModuleString, *myModule, *myFunction, *myResult; Py_Initialize(); myModuleString = PyUnicode_FromString((char*)"verify"); myModule = PyImport_Import(myModuleString); myFunction = PyObject_GetAttrString(myModule,(char*)"verify"); myResult = PyObject_CallObject(myFunction, NULL); const char* s = PyUnicode_AsUTF8(myResult); printf("REPR: %s\n", s); Py_Finalize(); return 0;}
Create the object file works fine:
$ gcc -c `python3.7-config --cflags --ldflags` source_code.c$
But it does not work at the end:
$ gcc source_code.o -o source_code.bin/usr/bin/ld: source_code.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIE/usr/bin/ld: final link failed: nonrepresentable section on outputcollect2: error: ld returned 1 exit status
The -fPIE
argument also does not help:
$ gcc -c `python3.7-config --cflags --ldflags` -fPIE source_code.c$$ gcc source_code.o -o source_code.bin/usr/bin/ld: source_code.o: in function `main':/home/user/source_code.c:7: undefined reference to `Py_Initialize'/usr/bin/ld: /home/user/source_code.c:9: undefined reference to `PyUnicode_FromString'/usr/bin/ld: /home/user/source_code.c:10: undefined reference to `PyImport_Import'/usr/bin/ld: /home/user/source_code.c:12: undefined reference to `PyObject_GetAttrString'/usr/bin/ld: /home/user/source_code.c:13: undefined reference to `PyObject_CallObject'/usr/bin/ld: /home/user/source_code.c:15: undefined reference to `PyUnicode_AsUTF8'/usr/bin/ld: /home/user/source_code.c:18: undefined reference to `Py_Finalize'collect2: error: ld returned 1 exit status
How can I define the references to generate the binary file?