나는 실행 파일과 동적으로 링크 된 라이브러리로 구성된 임베디드 리눅스 C++ 응용 프로그램에 문제가 있습니다. 실행 파일은 라이브러리의 진입 점 중 하나 인 함수를 호출하지만 그 함수는 오동작합니다. gdb를 사용하여 조사한 결과 라이브러리 내의 다른 함수 xyz()를 호출해야하는 라이브러리 함수가 실제로 실행 파일 내에서 동일한 이름 xyz()의 함수를 호출한다는 것을 알았습니다.리눅스 라이브러리는 실행 파일에서 모호하게 이름 지정된 함수를 호출합니다 - 이것이 가능합니까?
나는 이것이 일어날 수있어서 매우 놀랍다. 어쩌면 나는 어리석은 짓을하고있다. 실행 파일을 참조하지 않고 라이브러리 자체에 링크되어 있지 않습니까? 실행 파일이 실행 파일에서 abc() 대신 라이브러리에서 abc()를 호출하면 라이브러리와 적어도 연결되어 있기 때문에 약간 더 이해할 수 있습니다.이 경우 링커는 이중 정의를 나타냅니다 ? 또는 로컬 기능의 우선 순위를 결정 하시겠습니까?
내 함수의 이름을 바꿀 수있어 이름이 일치하지 않지만 어떤 일이 벌어지고 있는지 이해하고 싶습니다. 나는이 영역이나 gcc 도구에 대해 많은 경험이 없다. 첫째, 위 시나리오에서 가능한 일이라고 생각합니까?
실행 파일과 라이브러리 모두 다른 라이브러리를 호출합니다. 사용중인 라이브러리의 link 명령은 다음과 같습니다.
powerpc-unknown-linux-gnuspe-g ++ - 4.9.3 aaa.o bbb.o [etc] -shared -o libmylibary.so -L ../otherlibpath -Wl, -rpath-link, ../otherlibpath -lotherlibname
실행 파일에 대한 연결 명령은 어떻게됩니까? '-rdynamic'을 사용합니까? –
@ WumpusQ.Wumbley : -rdynamic을 사용하지 않습니다. -Wl, -rpath-link, ../otherlibpath -lotherlibname -Wl, -Bstatic -lxxx -Wl, -Bdynamic -lmylibrary 여기서 lxxx는 정적으로 연결된 라이브러리이고 otherlib는 둘 다 연결된 동적 라이브러리입니다. 위에서 언급 한 것입니다. 귀하의 질문에 감사드립니다. – Spalteer