2012-08-08 4 views
0

지난 날 링커 지옥에서 다루어졌으며 누군가가 나를 도울 수 있는지를 알기 위해이 곳을 던져 보았습니다.명시 적 링크가있는 경우에도 정의되지 않은 기호

저는 건물에있는 두 개의 공유 라이브러리가 있습니다. 하나는 "libhttp"이고 다른 하나는 HTTP 프로토콜에 대한 더 나은 기능 또는 나쁜 기능을위한 것입니다. 두 번째 문제는 "libvpcutil"이라고합니다. 그것은 libhttp에있는 심볼에 의존하므로 libhttp에 링크합니다.

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 

컴파일 및 연결이 성공적으로 완료 : 여기에 OpenSSL을 총칭 내 개인적인 경로와 같은 사소한 것들로 (메이크 파일에서 폭발) 컴파일 지시자입니다. 다행히 http/libhttp.so.1.0에 대한 링크 단계를 언급했기를 바랍니다.

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에 나노를 할 때 나는 기본적으로 얻을 : 나는 libhttp.so.1.0에 나노를 할 경우

이제, 내가 (다른 사람의 사이에) 다음과 같은 출력을 얻을 : 나는 분명히 여기 자르는 것은,하지만 난 여기에 붙어있어 여기서 기호는 명확 libhttp에 정의되어 있습니다 해요

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

, 나는 libvpcutil에 대한 반대 링크,하지만 기호는 libvpcutil에서 정의되지 않습니다. 이로 인해 런타임 오류가 발생합니다.

누구든지 문제를 알고 계십니까?

+0

일반적으로 서명이 일치하지 않는다는 의미입니다. 함수가 선언되고 구현되고 호출되는 곳에서 소스 코드를 확인하십시오 (도움이 필요하면 여기에 넣으십시오). – littleadv

+0

@littleadv, 서명이 일치하지 않으면 런타임 전에 오류가 발생하고 'nm' 출력을 보면 일치 할 수 있습니다. –

+0

@JonathanWakely 우리는 다른 것들을보고 있다고 확신합니다. 질문에서, 당신은 두 개의'nm' 출력을 가지며, 과부하 된 매개 변수를 가진 함수들을 나열하고 오직 하나만 다른 것과 쌍을 이룹니다. – littleadv

답변

1

예상되는 동작처럼 보입니다.

공유 라이브러리에 연결하는 것은 정적 라이브러리에 링크하는 것과 같지 않습니다. 필요한 심볼이 출력 파일에 복사되지 않습니다. 런타임에 심볼을 참조해야합니다. 따라서 기호가 U by nm으로 표시되는 것이 정상입니다.

런타임 오류 란 무엇입니까? 아마도 런타임에 libhttp.so.1.0 라이브러리를 찾을 수 없다는 뜻입니다. libvpcutil.soldd을 실행하고 실행 파일에 따라 libhttp.so.1.0에 의존하는지 확인하고 올바른 주소를 찾고 있는지 확인해야합니다.

libhttp.so.1.0에는 soname이 설정되어 있습니까? 파일 이름과 같지 않으면 soname과 같은 이름의 심볼릭 링크가 있습니까? (예 : soname이 libhttp.so.1 인 경우 심볼릭 링크 libhttp.so.1 -> libhttp.so.1.0 필요). 또한 libhttp.so.1.0http 디렉토리에 있지만 RPATH에 없으므로 런타임에는 찾을 수 없습니다.

관련 문제