LD_LIBRARY_PATH
環境変数をテストしようとしています。次のプログラムがありますtest.c
。
int main()
{
func("hello world");
}
func1.cとfunc2.cという2つのファイルがあります。
// func1.c
#include <stdio.h>
void func(const char * str)
{
printf("%s", str);
}
そして
// func2.c
#include <stdio.h>
void func(const char * str)
{
printf("No print");
}
どういうわけか次のことをしたいと思います。
func1.c
と.soファイルに変換func2.c
- どちらも同じ名前ですfunc.so
(たとえば、dir1
dir2
- stコンパイル中に
test.c
依存関係があるとだけ言及しましたが、func.so
どこにいるのかは教えてくれませんでした(環境変数を使用してこれを探したかったです)。 - 環境変数を設定し、最初に試して
dir1
、2回目に試して、プログラムを実行するたびに異なる出力をdir2
観察します。test
上記の内容は可能ですか?それでは、ステップ2はどうすればよいですか?
ステップ1では、次の操作を行いました(func2でも同じステップ)。
$ gcc -fPIC -g -c func1.c
$ gcc -shared -fPIC -o func.so func1.o
ベストアンサー1
使用ld -soname
:
$ mkdir dir1 dir2
$ gcc -shared -fPIC -o dir1/func.so func1.c -Wl,-soname,func.so
$ gcc -shared -fPIC -o dir2/func.so func2.c -Wl,-soname,func.so
$ gcc test.c dir1/func.so
$ ldd a.out
linux-vdso.so.1 => (0x00007ffda80d7000)
func.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f639079e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6390b68000)
$ LD_LIBRARY_PATH='$ORIGIN/dir1:$ORIGIN/dir2' ./a.out
hello world
$ LD_LIBRARY_PATH='$ORIGIN/dir2:$ORIGIN/dir1' ./a.out
No print
-Wl,-soname,func.so
(これは-soname func.so
出力にld
含まれる属性に渡されることを意味しますSONAME
。)func.so
次のように確認できますreadelf -d
。
$ readelf -d dir1/func.so
Dynamic section at offset 0xe08 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [func.so]
...
func.so
そしてlinkSONAME
のa.out
属性は次のとおりですNEEDED
。
$ readelf -d a.out
Dynamic section at offset 0xe18 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [func.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
...
そうでない場合は、-Wl,-soname,func.so
次のような結果が得られますreadelf -d
。
$ readelf -d dir1/func.so
Dynamic section at offset 0xe18 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
...
$ readelf -d a.out
Dynamic section at offset 0xe18 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [dir1/func.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
...