Teach me about dynamic libraries


 
Thread Tools Search this Thread
Operating Systems Solaris Teach me about dynamic libraries
# 1  
Old 10-10-2016
Teach me about dynamic libraries

Hi all,
new guy here, first post, with a question.

My background : some linux experience, moved over to OmniOS with Napp-it front end for a home NAS server, but getting more familiar with CLU.

Situation : I built APCUPSD to interface with my UPS. During the configure I specified the following flags:
Code:
./configure \
  --prefix=/usr/local \
  --sbindir=/usr/local/sbin \
  --sysconfdir=/etc/apcupsd \
  --mandir=/usr/local/share/man \
  --with-log-dir=/var/log \
  --disable-cgi \
  --enable-usb

The make and install went fine, but on trying to load the daemon I get the following error.

Code:
#/etc/init.d/apcupsd start
Starting apcupsd power management ...ld.so.1: apcupsd: fatal: libusb.so.1: open failed: No such file or directory
/etc/init.d/apcupsd: line 24: 15893: Killed
        Failed.

The file does exist, but I guess it isn't where it is supposed to be.
Code:
# find / -name libusb.so.1
find: ‘/proc/16084/fd/5': No such file or directory
find: ‘/proc/16084/path/5': No such file or directory
/usr/sfw/lib/libusb.so.1

I was able to solve this by exporting the path
Code:
# export LD_LIBRARY_PATH=/usr/sfw/lib/

Then the daemon worked.

However, whenever the machine reboots, the daemon will fail to load since I need to manually first re-export the path. I feel like manually remembering to do this every reboot is not the correct solution, and just a work-around.

First steps to solution
I'm trying to follow Sun's documentation on "4.3 Setting Library Search Paths and Order" [ I cannot post a direct link yet but google search should point to the doc if you are interested ]

However, I'm not really understanding the differences between dynamic and static linking.

QUESTION

My main question is "how do I solve the problem of LDD finding libusb.so.1 in /usr/sfw/lib/ when a reboot occurs so the APCUPSD daemon auto-starts".

A follow up for my own edification would be to explain dynamic vs static library linking. Do I need to re-compile APCUPSD with flags that point to libusb.so.1? Should I make a sym link pointing to libusb.so.1 in the directory that ldd normally searches?

Thanks in advance for all the help!
# 2  
Old 10-10-2016
You define the location of runtime shared libraries in an environment variable LD_LIBRARY_PATH

You edit .profile or .bashrc or whatever you use to define environment vars. Add a line like this.
Code:
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/lib/sfw/lib"

To check the variable use:
Code:
ldd /path/to/APCUPSD

or whatever name you gave your compiled code.
# 3  
Old 10-11-2016
Edit the file /etc/init.d/apcupsd to include the definition of LD_LIBRARY_PATH there.

Alternatively, if you installed from source (which is implied in the post) you can remove the need of the LD_LIBRARY_PATH environment variable as follows:

Go back to the Makefile. If you are using the Sun compiler (/opt/SUNSpro/... or /opt/solstudio/...) add -R/usr/sfw/lib after each use of -L/usr/sfw/lib. If you are using the gnu compiler you may need to use -Wl,-rpath,"/usr/sfw/lib" instead.

Then recompile and test the binary with ldd:
Code:
ldd apcupsd

All libraries should be found. At this point reinstall.

Andrew
# 4  
Old 10-11-2016
Quote:
Originally Posted by apmcd47
Edit the file /etc/init.d/apcupsd to include the definition of LD_LIBRARY_PATH there.
Simple enough, thanks. That would probably solve all my problems...

Quote:
Alternatively, if you installed from source (which is implied in the post) you can remove the need of the LD_LIBRARY_PATH environment variable as follows:

Go back to the Makefile. If you are using the Sun compiler (/opt/SUNSpro/... or /opt/solstudio/...) add -R/usr/sfw/lib after each use of -L/usr/sfw/lib. If you are using the gnu compiler you may need to use -Wl,-rpath,"/usr/sfw/lib" instead.

Then recompile and test the binary with ldd:
Code:
ldd apcupsd

All libraries should be found. At this point reinstall.

Andrew
How elegant! Now I want to try this (without screwing anything up hopefully)...
Sorry, I don't usually use GCC to build my programs, I use Make (which calls GCC to compile them). I am using GNU GCC 4.6.3. So to be clear, I go back to the directory with my make file, and instead of re-running
Code:
Make

and
Code:
Make install

I would run
Code:
gcc -WI,-rpath,"/usr/sfw/lib"

?
How would I install it then, can I run 'make install'?
# 5  
Old 10-27-2016
Quote:
Originally Posted by DerfMan

Sorry, I don't usually use GCC to build my programs, I use Make (which calls GCC to compile them). I am using GNU GCC 4.6.3. So to be clear, I go back to the directory with my make file, and instead of re-running
Code:
Make

and
Code:
Make install

I would run
Code:
gcc -WI,-rpath,"/usr/sfw/lib"

?
How would I install it then, can I run 'make install'?
Sorry, I didn't notice your reply until now.
YOu edit the Makefile to add the rpath snippet either to the LDFLAGS variable or directly to the line that builds the binary. You should find a pair of lines like this:
Code:
apcupsd:  $(OBJS)
          $(CC) ... -o apcupsd ...

If the library is explicitly mentioned (rather than being hidden in say $(LIBS)) put it just before that:
Code:
... -Wl,-rpath,"/usr/sfw/lib" -lusb ...

You then use make and make install as before
Andrew
Login or Register to Ask a Question

Previous Thread | Next Thread

6 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

I have here my assignment can any one teach me please

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: Is to compute for the discount of the two variables of TODDLER and KID 2. Relevant commands, code, scripts,... (3 Replies)
Discussion started by: stephanielana1
3 Replies

2. Programming

I want to know some c libraries

I'm a rookie to C and i'm looking for some libraries to learn,something likes the C++ STL or Boost ,does any1 can tell me some of them?Thanks a lot:) Eric (3 Replies)
Discussion started by: homeboy
3 Replies

3. UNIX for Advanced & Expert Users

Sql dynamic table / dynamic inserts

I have a file that reads File (X.txt) Contents of record 1: rdrDESTINATION_ADDRESS (String) "91 971502573813" rdrDESTINATION_IMSI (String) "000000000000000" rdrORIGINATING_ADDRESS (String) "d0 movies" rdrORIGINATING_IMSI (String) "000000000000000" rdrTRAFFIC_EVENT_TIME... (0 Replies)
Discussion started by: magedfawzy
0 Replies

4. UNIX for Advanced & Expert Users

What to teach the new guy

so I have taken on the task of running a few workshops / teaching sessions. we have three new unix people, they have the basics sorted, CD, PWD, LS and such. we are looking at people who have been doing helpdesk untill two months ago. I have given them a few session: file systems, what... (2 Replies)
Discussion started by: robsonde
2 Replies

5. UNIX for Dummies Questions & Answers

libraries

I am slowly ploughing my way through the list of links to on-line tutorials you provided to newbies. I for one am grateful for such a comprehensive list, so first of all thank you for that. What i cannot seem to find, is information on C++ libraries: The two links on libraries in your list... (0 Replies)
Discussion started by: pil888
0 Replies

6. Programming

school or teach myself?

I want to learn c lenguage and am wonder if is better if i go to a school or teach myself, or there is no to much diference? Thank you (9 Replies)
Discussion started by: nobody
9 Replies
Login or Register to Ask a Question