On 2016 Oct 30 (Sun) at 15:17:34 +0100 (+0100), Jeremie Courreges-Anglas wrote:
:Peter Hessler <[email protected]> writes:
:
:> I would like to use pcapy in a python3 module, so we need to update it.
:>
:> However, when I run the test program, I get the following error:
:>
:> python2.7:/usr/local/lib/python2.7/site-packages/pcapy.so: undefined
:> symbol '_Z10bpf_filterPK8bpf_insnPKhjj'
:> Traceback (most recent call last):
:> File "/usr/local/tests/pcapytests.py", line 8, in <module>
:> import pcapy
:> ImportError: Cannot load specified object
:>
:> Based on what I can tell, pcapy.so is linked against libpcap, which
:> should provide those symbols.
:>
:> $ ldd /usr/local/lib/python2.7/site-packages/pcapy.so
:> /usr/local/lib/python2.7/site-packages/pcapy.so:
:> Start End Type Open Ref GrpRef Name
:> 000010ffb9019000 000010ffb921f000 dlib 2 0 0
/usr/local/lib/python2.7/site-packages/pcapy.so
:> 000010ff88f9c000 000010ff891c1000 rlib 0 1 0
/usr/lib/libpcap.so.8.1
:> 000010ff5d7d6000 000010ff5daed000 rlib 0 1 0
/usr/lib/libstdc++.so.57.0
:> 000010ff9925f000 000010ff99636000 rlib 0 1 0
/usr/local/lib/libpython2.7.so.0.0
:> 000010fee0ee9000 000010fee1110000 rlib 0 3 0
/usr/lib/libm.so.10.0
:> 000010ff63fa3000 000010ff641b2000 rlib 0 1 0
/usr/lib/libpthread.so.23.0
:> 000010fef2919000 000010fef2b26000 rlib 0 1 0
/usr/lib/libutil.so.12.1
:>
:> Ideas?
:
:C++ name mangling is affecting the functions declared in net/bpf.h.
:Probably a __BEGIN_DECLS / __END_DECLS pair missing.
:
:--
:jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE
:
Yup, that was it.
How risky is that? Should this be tested in a bulk?
(moved to tech@) OK?
Index: sys/net/bpf.h
===================================================================
RCS file: /cvs/openbsd/src/sys/net/bpf.h,v
retrieving revision 1.58
diff -u -p -u -p -r1.58 bpf.h
--- sys/net/bpf.h 12 Sep 2016 16:24:37 -0000 1.58
+++ sys/net/bpf.h 30 Oct 2016 16:21:32 -0000
@@ -276,11 +276,13 @@ struct bpf_ops {
#define BPF_STMT(code, k) { (u_int16_t)(code), 0, 0, k }
#define BPF_JUMP(code, k, jt, jf) { (u_int16_t)(code), jt, jf, k }
+__BEGIN_DECLS
u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int)
__bounded((__buffer__, 2, 4));
u_int _bpf_filter(const struct bpf_insn *, const struct bpf_ops *,
const void *, u_int);
+__END_DECLS
#ifdef _KERNEL
struct ifnet;
--
Every program has two purposes -- one for which it was written and
another for which it wasn't.