compiling libtirpc and rpcbind against uclibc-0.9.30.2

Natanael Copa natanael.copa at gmail.com
Tue Feb 2 10:10:16 UTC 2010


Hi,

I think the idea was to drop the rpc stuff from uclibc and rely on
libtirpc and rpcbind.

I have been able to compile libgssglue, heimdal and libtirpc against
uclibc but i get a linker error when trying to compile rpcbind.

To be able compile libtirpc I had to manually create src/rpcsvc and
copy the nis.h file in there. It is needed fomr some define.

I was able to compile rpcbind with this:

diff --git a/src/rpcbind.c b/src/rpcbind.c
index 525ffba..1fe1a60 100644
--- a/src/rpcbind.c
+++ b/src/rpcbind.c
@@ -67,7 +67,11 @@
 #include <pwd.h>
 #include <string.h>
 #include <errno.h>
+#if defined(__UCLIBC__)
+#define __nss_configure_lookup(x,y)
+#else
 #include <nss.h>
+#endif
 #include "config.h"
 #include "rpcbind.h"

and this:

diff --git a/src/security.c b/src/security.c
index 0edeac6..e9fed55 100644
--- a/src/security.c
+++ b/src/security.c
@@ -20,6 +20,32 @@
 /*
  * XXX for special case checks in check_callit.
  */
+#if defined(__UCLIBC__)
+
+#define MOUNTPROC_MNT 1
+#define MOUNTPROC_UMNT 3
+
+#define NFS_PROGRAM    100003
+#define YPPROG         100004
+#define MOUNTPROG      100005
+#define YPBINDPROG     100007
+#define YPPASSWDPROG   100009
+#define RQUOTAPROG     100011
+
+#define YPPROC_NULL    0
+#define YPPROC_DOMAIN  1
+#define YPPROC_DOMAIN_NONACK 2
+#define YPPROC_MATCH   3
+#define YPPROC_FIRST   4
+#define YPPROC_NEXT    5
+#define YPPROC_XFR     6
+#define YPPROC_CLEAR   7
+#define YPPROC_ALL     8
+
+#define YPBINDPROC_SETDOM      2
+
+#else
+
 #include <rpcsvc/mount.h>
 #include <rpcsvc/rquota.h>
 #include <rpcsvc/nfs_prot.h>
@@ -27,6 +53,8 @@
 #include <rpcsvc/ypclnt.h>
 #include <rpcsvc/yppasswd.h>

+#endif
+
 #include "rpcbind.h"

 #ifdef LIBWRAP


However, during linking I get the following error:

ccache gcc -march=i486 -Os -fomit-frame-pointer -pipe -Wl,--as-needed
-o rpcbind check_bound.o rpcbind.o rpcb_svc_4.o rpcb_svc_com.o util.o
pmap_svc.o rpcb_stat.o rpcb_svc.o security.o warmstart.o
/usr/lib/libtirpc.so -lnsl /usr/lib/libgssglue.so
/usr/lib/libgssapi.so /usr/lib/libheimntlm.so /usr/lib/libkrb5.so
/usr/lib/libhx509.so /usr/lib/libheimsqlite.so /usr/lib/libwind.so
/usr/lib/libhcrypto.so /usr/lib/libasn1.so -lcom_err -ldl
/usr/lib/libroken.so -lcrypt -lpthread
/usr/lib/libtirpc.so: undefined reference to `key_encryptsession_pk'
/usr/lib/libtirpc.so: undefined reference to `getnetname'
/usr/lib/libtirpc.so: undefined reference to `cbc_crypt'
/usr/lib/libtirpc.so: undefined reference to `ecb_crypt'
/usr/lib/libtirpc.so: undefined reference to `getpublickey'
/usr/lib/libtirpc.so: undefined reference to `key_gendes'
collect2: ld returned 1 exit status
make[3]: *** [rpcbind] Error 1


As I understand those are not implemented in uclibc, and never will
since we are supposed to rely on libtirpc and rpcbind.

I would guess we have the following options:

1. have libtirpc to use openssl for the crypto funcs
2. have libtirpc to use gnutls for the crypto funcs
3. implement key_encryptsession_pk, getnetname, cbc_crypt, ecb_crypt,
getpublickey and key_gendes in uclibc.

Any ideas how to move forward?

-- 
Natanael Copa


More information about the uClibc mailing list