1

I'm working on a Linux project in C consisting of two different open source applications. "Project A" (libduo) creates an archive used for linking a couple test programs and creates the library like this:

/usr/bin/ar rv libduo.a duo.o http_parser.o https.o match.o parson.o urlenc.o
/usr/bin/ar: creating libduo.a
a - duo.o
a - http_parser.o
a - https.o
a - match.o
a - parson.o
a - urlenc.o
ranlib libduo.a

One of the libduo test programs is built like this:

gcc -g -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -I. -I.   -DDUODIR=\"/usr/local/duo/libduo/etc\" -DHAVE_CONFIG_H -c test-duologin.c
gcc -o test-duologin test-duologin.o -L.   -lduo -lssl -lcrypto 

"Project B" is an OpenLDAP module which I've built with -lduo and a few options to tell it where to find things:

(cd .libs && rm -f pw-apr1.la && ln -s ../pw-apr1.la pw-apr1.la)
../../../libtool --mode=compile gcc -g -O2 -Wall  -I../../../include -I../../../include -I../../../servers/slapd -I../../../contrib/slapd-modules/passwd/libduo -c pw-duo.c
 gcc -g -O2 -Wall -I../../../include -I../../../include -I../../../servers/slapd -I../../../contrib/slapd-modules/passwd/libduo -c pw-duo.c  -fPIC -DPIC -o .libs/pw-duo.o
 gcc -g -O2 -Wall -I../../../include -I../../../include -I../../../servers/slapd -I../../../contrib/slapd-modules/passwd/libduo -c pw-duo.c -o pw-duo.o >/dev/null 2>&1
../../../libtool --mode=link gcc -g -O2 -Wall -version-info 0:0:0 \
-rpath /usr/local/libexec/openldap -module -o pw-duo.la pw-duo.lo libduo.a -lduo

*** Warning: Linking the shared library pw-duo.la against the
*** static library libduo.a is not portable!
cc -shared  .libs/pw-duo.o  libduo.a -lduo  -Wl,-soname -Wl,pw-duo.so.0 -o .libs/pw-duo.so.0.0.0
/usr/bin/ld: libduo.a(duo.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
libduo.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:51: recipe for target 'pw-duo.la' failed
make: *** [pw-duo.la] Error 1

The Makefile I'm using is the same one distributed with the OpenLDAP project. I've just added a section in the Makefile to build my module, using the same options for the other modules already there but adding -lduo to my section along with the paths to the libduo includes and libduo.a.

As make suggests above, I've recompiled by adding -fPIC after the -Wall option but it the same error was repeated. As a last resort, I tried adding -static to the module build but make was having none of that either:

*** Warning: Linking the shared library pw-duo.la against the
*** static library libduo.a is not portable!

This is the first time I've tried to build a C application against a lib not in the standard Linux locations so not exactly sure what's going on. I suspect libduo is built intended to be statically linked into everything, but the OpenLDAP modules are designed to use shared libraries. Can anyone elucidate?

Update: with help of comments below and this link I created a shared library from the .o files and distributed/built against that.

Server Fault
  • 637
  • 1
  • 6
  • 16
  • You need to build the object files in the *library* with `-fPIC`. – Some programmer dude Apr 03 '19 at 12:59
  • Added `-fPIC` but getting the same `libduo.a is not portable` error building the module (maybe I have some stray edits in there yet..). build for the library is now this: `gcc -g -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -fPIC -I. -I. -DDUODIR=\"/usr/local/duo/libduo/etc\" -DHAVE_CONFIG_H -c urlenc.c /usr/bin/ar rv libduo.a duo.o http_parser.o https.o match.o parson.o urlenc.o /usr/bin/ar: creating libduo.a`. Do I need to modify the `ar` or `ranlib` commands maybe? – Server Fault Apr 03 '19 at 13:08
  • Don't mix `-shared` and `-static`, that's not possible. But if you build all the object files in the library with `-fPIC` then the first problem you have should be solved. – Some programmer dude Apr 03 '19 at 13:10
  • Gotcha. Not sure where that `-static` stuff is happening yet. Still looking.. – Server Fault Apr 03 '19 at 13:13
  • @Someprogrammerdude - Thanks! compiled and working. I owe you a beverage :) – Server Fault Apr 03 '19 at 15:05
  • I'll hold you to that! ;) – Some programmer dude Apr 03 '19 at 15:24

0 Answers0