Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Feb 2010 22:10:16 -0800
From:      Stephen Hurd <shurd@sasktel.net>
To:        =?UTF-8?B?RGFnLUVybGluZyBTbcO4cmdyYXY=?= <des@des.no>
Cc:        Ronald <followait@163.com>, "Freebsd-Chat@Freebsd.Org" <freebsd-chat@freebsd.org>
Subject:   Re: Where to put private lib files?
Message-ID:  <4B861448.2040207@sasktel.net>
In-Reply-To: <4B84C02A.9010001@sasktel.net>
References:  <DD958BBC52D94F79855244E6890704DB@jqslaptop> <868wak2sv5.fsf@ds4.des.no> <4B83B4AA.3030405@sasktel.net> <864ol817yq.fsf@ds4.des.no> <4B84C02A.9010001@sasktel.net>

index | next in thread | previous in thread | raw e-mail

Stephen Hurd wrote:
>>> You can also compile in a search path.
>>>     
>>
>> Not PREFIX-safe, hence not allowed in ports unless there is no other
>> solution
>
> Eh?  It doesn't need to be an absolute path.

To follow up on this for you Ronald, to compile in a PREFIX-safe 
relative library path, you need to pass -z origin -rpath 
$ORIGIN/../lib/pkgname to the linker... that is a literal $ so assuming 
you're using regular make files and gcc as the linker, you would add 
this line:

LDFLAGS += -Wl,-z,origin,-rpath,\$$ORIGIN/../lib/$(PORTNAME)

You need to double the $ so that make doesn't expand $ORIGIN for you and 
the \ is for the shell.  The command line would be something like this:
cc -O2 -pipe -march=pentium4  -Wl,-z,origin,-rpath,\$ORIGIN/../lib/test 
test.c -L. -ltest -o test

You may need to fiddle around to get the literal $ in there, a strings 
on the compiled binary would include ``$ORIGIN/../lib/test'' (without 
the quotes of course).

The reason you *need* to use $ORIGIN is that if you don't the relative 
path will be to whatever the pwd is when the process is started making 
them effectively random.

Have fun!


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4B861448.2040207>