Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rpath=$ORIGIN not having desired effect?

Tags:

I've got a binary "CeeloPartyServer" that needs to find libFoundation.so at runtime, on a FreeBSD machine. They're both in the same directory. I compile (on another platform, using a cross compiler) CeeloPartyServer using linker flag -rpath=$ORIGIN.

> readelf -d CeeloPartyServer |grep -i rpath  0x0000000f (RPATH)                      Library rpath: [$ORIGIN] > ls CeeloPartyServer    Contents        Foundation.framework    libFoundation.so > ./CeeloPartyServer  /libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer" 

Why isn't it finding the library when I try to run it?

My exact linker line is: -lm -lmysql -rpath=$ORIGIN.

I am pretty sure I don't have to escape $ or anything like that since my readelf analysis does in fact show that library rpath is set to $ORIGIN. What am I missing?

like image 585
Nektarios Avatar asked Jun 12 '11 19:06

Nektarios


People also ask

What is Rpath $origin?

What is RPATH and $ORIGIN. RPATH stands for run-time search path. According to Wikipedia, “rpath designates the run-time search path hard-coded in an executable file or library.

What is Rpath in Makefile?

In computing, rpath designates the run-time search path hard-coded in an executable file or library. Dynamic linking loaders use the rpath to find required libraries. Specifically, it encodes a path to shared libraries into the header of an executable (or another shared library).


2 Answers

I'm assuming you are using gcc and binutils.

If you do

readelf -d CeeloPartyServer | grep ORIGIN 

You should get back the RPATH line you found above, but you should also see some entries about flags. The following is from a library that I built.

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib] 0x000000000000001e (FLAGS)              ORIGIN 0x000000006ffffffb (FLAGS_1)            Flags: ORIGIN 

If you aren't seeing some sort of FLAGS entries, you probably haven't told the linker to mark the object as requiring origin processing. With binutils ld, you do this by passing the -z origin flag.

I'm guessing you are using gcc to drive the link though, so in that case you will need to pass flag through the compiler by adding -Wl,-z,origin to your gcc link line.

like image 82
acm Avatar answered Sep 18 '22 15:09

acm


Depending on how many layers this flag passes through before the linker sees it, you may need to use $$ORIGIN or even \$$ORIGIN. You will know that you have it right when readelf shows an RPATH header that looks like $ORIGIN/../lib or similar. The extra $ and the backslash are just to prevent the $ from being processed by other tools in the chain.

like image 32
Michael Dillon Avatar answered Sep 20 '22 15:09

Michael Dillon