ports/174689: lang/python27: 64-bit pointers returned by C library get reduced to 32-bit

Marcus von Appen mva at FreeBSD.org
Tue Dec 25 14:52:46 UTC 2012


> When initializing libmpg123.so.0 (audio/mpg123) from Python with CDLL,
> the 64-bit pointer value returned by mpg123_new(None, None) gets
> reduced to 32 bits. The equivalent program in C does not have this
> problem.

> from ctypes import *
>
> mpg123 = CDLL('libmpg123.so') # audio/mpg123
> print mpg123
>
> MPG123_OK = 0
> if mpg123.mpg123_init() != MPG123_OK:
>     print "mpg123_init() failed"
> else:
>     mh = mpg123.mpg123_new(None, None)
[...]

I do not see that you provide any information to ctypes about how the
function mpg123_new() should behave. By default it will assume to return
a ctypes.c_int, which most likely will be a 4-byte value.

>>> import ctypes
>>> print ctypes.sizeof(ctypes.c_int)
4

Furthermore, the mpg123.h header declares the function as

   mpg123_handle *mpg123_new(const char* decoder, int *error);

mpg123_handle is a struct typedef. Instead of using a 4-byte int, you
might be better of with properly declaring the arguments
(POINTER(c_char) and POINTER(c_int)) and  return
value (c_void_p or a Structure stub) of the function within your ctypes
code.

From what I can see on my test platform, it works properly according to
the basic ctypes definition.

Cheers
Marcus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-python/attachments/20121225/17acd2bf/attachment.sig>


More information about the freebsd-python mailing list