0

過去 1 日間リンカー地獄を扱っていたので、これを捨てて、誰かが私を助けてくれるかどうかを確認しようと考えました。

私が構築している共有ライブラリが 2 つあります。1 つは "libhttp" と呼ばれ、http プロトコル用のヘルパー関数をいくつか持っています。2 つ目は「libvpcutil」と呼ばれ、問題を引き起こしています。libhttp にあるシンボルに依存するので、libhttp に対してリンクします。これは、生成された openssl への個人的なパスなどのマイナーなものを含むコンパイル ディレクティブ (make ファイルから展開) です。

g++ -shared -Wl,-soname,libvpcutil.so.1 -o libvpcutil.so.1.0  vpcreg/registry.o \
vpcreg/vpcreg2.o  dbase/dbase.o dbase/sqlutils.o  diaglog/diaglog.o  errmsg/errmsg.o  \
faillib/faillib.o  failover/failover.o  initerr/init_err.o  kmq/kmq.o kmq/publish.o  \
kthread/kcom.o kthread/kthread.o  libobdi/odi_serv.o  mutex/mutex.o  netserv/netserv.o  \
newmem/newmem.o  rmtstore/avlmem.o rmtstore/rmtstore.o rmtstore/shm_aloc.o  \
servhand/servhand.o  timers/timers.o  vpcstamp/vpcstamp.o  websql/websql.o  types/blob.o \
types/hitime.o types/ticks.o types/timestamp.o  odasm/odasm.o  webvibapi/webvibapi.o  \
vibusfeed/vibusfeed.o  propstore/propstore2.o  cardlib/cardlib.o cardlib/sortlist.o  \
gapi/genapi.o -L/usr/lib/i386-linux-gnu -lm -lrt -lxml2 -lodbc -L/usr/lib/i386-linux-gnu -\
lcurl -Wl,-Bsymbolic-functions -Wl,-z,relro \
-L/pathtoopenssl/openssl -lssl -lcrypto  -lxml2   -lreadline -\
lcurses -Wl,-rpath=.:/pathtobin/bin http/libhttp.so.1.0 ../ddldata/ddldata.o 
../cardddl/cardddl.o ../gendata/generic.o

コンパイルとリンクが正常に完了します。http/libhttp.so.1.0 へのリンク手順に注意していただければ幸いです。

ここで、libhttp.so.1.0 で nm を実行すると、(とりわけ) 次の出力が得られます。

00015d5a T _ZN12http_cookiesC1Ev
00015d5a T _ZN12http_cookiesC2Ev
00015d7e T _ZN12http_cookiesD1Ev
00015d7e T _ZN12http_cookiesD2Ev
00011574 T _ZN12http_headers11url_expressERSo
00011466 T _ZN12http_headers12http_expressERSo

しかし、libvpcutil.so.1.0 で nm を実行すると、基本的に次のようになります。

     U _ZN12http_cookiesC1Ev
     U _ZN12http_cookiesD1Ev
     U _ZN12http_headers11url_expressERSo
     U _ZN12http_headers3setEPKcRKSs
     U _ZN12http_headers3setEPKcS1_
     U _ZN12http_headersC1Ev
     U _ZN12http_headersD1Ev

私は明らかにここを切り取っていますが、ここで立ち往生しているのは、シンボルが libhttp で明確に定義されていることです。libvpcutil に対してリンクしますが、シンボルは libvpcutil で未定義です。これにより、実行時エラーが発生します。

誰もが問題を見ますか?

4

1 に答える 1

1

それは期待される動作のように見えます。

共有ライブラリへのリンクは、静的ライブラリへのリンクとは異なります。必要なシンボルは出力ファイルにコピーされません。実行時に解決する必要があるシンボルへの参照を取得するだけです。したがって、シンボルが のように表示されるのは正常Uですnm

実行時エラーにはどのようなものがありますか? おそらくlibhttp.so.1.0、実行時にライブラリが見つからないことを意味します。ldd実行可能ファイルを何度も実行しlibvpcutil.soて、それらが依存しlibhttp.so.1.0ているかどうか、および正しいものを見つけているかどうかを確認できるはずです。

そなめlibhttp.so.1.0セットはありますか?ファイル名と同じでない場合、soname と同じ名前のシンボリック リンクがありますか? (たとえば、 soname の場合はlibhttp.so.1symlink が必要ですlibhttp.so.1 -> libhttp.so.1.0)。libhttp.so.1.0また、あなたが呼ばれるディレクトリにあることもわかりますがhttp、それはRPATHにないため、実行時に見つかりません。

于 2012-08-09T07:59:34.883 に答える