[Python-Dev] stuck with dlopen...
Gregory P. Smith
greg at krypto.org
Mon Jan 19 20:53:13 CET 2009
If you run your python.exe under gdb you should be able to set a future
breakpoint on your _PyEval_EvalMiniFrameEx function and debug from there.
On Wed, Jan 14, 2009 at 8:28 PM, <skip at pobox.com> wrote:
>
> I've recently been working on generating C functions on-the-fly which
> inline
> the C code necessary to implement the bytecode in a given Python function.
> For example, this bytecode:
>
> >>> dis.dis(f)
> 2 0 LOAD_FAST 0 (a)
> 3 LOAD_CONST 1 (1)
> 6 BINARY_ADD
> 7 RETURN_VALUE
>
> is transformed into this rather boring bit of C code:
>
> #include "Python.h"
>
> #include "code.h"
> #include "frameobject.h"
> #include "eval.h"
> #include "opcode.h"
> #include "structmember.h"
>
> #include "opcode_mini.h"
>
> PyObject *
> _PyEval_EvalMiniFrameEx(PyFrameObject *f, int throwflag)
> {
>
> static int jitting = 1;
>
> PyEval_EvalFrameEx_PROLOG1();
> co = f->f_code;
> PyEval_EvalFrameEx_PROLOG2();
>
> oparg = 0;
> LOAD_FAST_IMPL(oparg);
> oparg = 1;
> LOAD_CONST_IMPL(oparg);
> BINARY_ADD_IMPL();
> RETURN_VALUE_IMPL();
>
> PyEval_EvalFrameEx_EPILOG();
> }
>
> The PROLOG1, PROLOG2 and EPILOG macros are just chunks of code from
> PyEval_EvalFrameEx.
>
> I have the code compiling and linking, and dlopen and dlsym seem to work,
> returning apparently valid pointers, but when I try to call the function I
> get
>
> Program received signal EXC_BAD_ACCESS, Could not access memory.
> Reason: KERN_PROTECTION_FAILURE at address: 0x0000000c
> 0x0058066d in _PyEval_EvalMiniFrameEx (f=0x230d30, throwflag=0) at
> MwDLSf.c:17
>
> Line 17 is the PROLOG1 macro. I presume it's probably barfed on the very
> first instruction. (This is all on an Intel Mac running Leopard BTW.)
>
> Here are the commands generated to compile and link the C code:
>
> gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall \
> -Wstrict-prototypes -g -DPy_BUILD_CORE -DNDEBUG \
> -I/Users/skip/src/python/py3k-t/Include \
> -I/Users/skip/src/python/py3k-t -c dTd5cl.c \
> -o /tmp/MwDLSf.o
> gcc -L/opt/local/lib -bundle -undefined dynamic_lookup -g \
> /tmp/dTd5cl.o -L/Users/skip/src/python/py3k-t -lpython3.1 \
> -o /tmp/MwDLSf.so
>
> (It just uses the distutils compiler module to build .so files.) The .so
> file looks more-or-less ok:
>
> % otool -L /tmp/MwDLSf.so
> /tmp/MwDLSf.so:
> /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current
> version 111.1.3)
>
> though nm doesn't show that any undefined _Py* symbols so I suspect I'm not
> linking it correctly. The Python executable was built without
> --enable-shared. I've tried building with that config flag, but that just
> gives me fits during debugging because it always wants to find libpython in
> the installation directory even if I'm running python.exe from the build
> directory. Installing is a little tedious because it relies on a properly
> functioning interpreter.
>
> dlopen is called very simply:
>
> handle = dlopen(shared, RTLD_NOW);
>
> I used RTLD_NOW because that's what sys.getdlopenflags() returns. I'm not
> calling dlclose for the time being.
>
> I'm not exactly sure where I should go from here. I'd be more than happy
> to
> open an item in the issue tracker. I was hoping to get something a bit
> closer to working before doing that though. The failure to properly load
> the compiled function makes it pretty much impossble to debug the generated
> code beyond what the compiler can tell me.
>
> Any suggestions?
>
> Skip
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe:
> http://mail.python.org/mailman/options/python-dev/greg%40krypto.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20090119/90499c53/attachment-0001.htm>
More information about the Python-Dev
mailing list