을 해결할 수 없습니다. 임베디드 시스템 용 프로그램을 크로스 컴파일하고 있습니다. 이 프로그램은 공유 라이브러리를 사용하는데, 나는 이것을 openend한다.심볼
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> //needed for dynamic linking
void *FunctionLib; //Handle to shared lib file
int (*Function)(); //Pointer to loaded routine
const char *dlError; //Pointer to error string
int main(argc, argv)
{
int rc; //return codes
printf("start...\n");
//Open Dynamic Loadable Libary with absolute path
FunctionLib = dlopen("/lalabu/sharedLib.so",RTLD_LAZY | RTLD_GLOBAL);
dlError = dlerror();
printf("Open sharedLib.so returns: %s \n", dlError);
if(dlError) exit(1);
//Find function
Function = dlsym(FunctionLib, "getSomething");
dlError = dlerror();
printf("Find symbol getSomething returns: %s \n", dlError);
if(dlError) exit(1);
...
나는 경고 및 재료없이 작동 다음 명령
mips-linux-uclibc-gcc -Wall -ldl ./dynamic_linking.c -o /dynamic_linking
으로 코드를 컴파일하고있다.
난 지금 내 장치에이 코드를 실행하려고하면, 나는 다음과 같은 오류 얻을 : 내가 sharedLib.so 가져올 원하는 기능 IDA로 살펴 경우
# ./dynamic_linking
start...
Open sharedLib.so returns: (null)
Find symbol getSomething returns: Unable to resolve symbol
./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev'
을, 나는 함수를 참조하십시오 (또는 기호 ?) '_ZNSt8ios_base4InitD1Ev'그리고 어디에 있어야하는지 (libc.so.0).
IDA를 사용하여 libc.so.0을 다시 살펴 본다면 이와 같은 함수가 표시되지 않습니다. ios_base, ios 또는 base와 같은 것도 없습니다.
는 I 위의 에러 난 또한 제가 시도 제가
Segmentation fault (core dumped)
대신
./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev'
얻는 대신 RTLD_LAZY의 RTLD_NOW를 사용할 때를 제외하고 항상 결과는 dlopen()와 이미 각종 플래그의 조합을 시도 rdynamic과 같은 몇 가지 gcc 연결 옵션은 항상 동일한 결과를 제공합니다.
또한 _zNSt8ios_base4InitD1Ev, 내 c- 코드가 작동하는지 확인하려면 'libc.so.0'을 사용하지 않는 공유 라이브러리를 사용하려고했습니다. 이름과 절대 경로 만 변경하고 찾기 기능 부분을 삭제했습니다. 오류없이 작동했습니다.
내 게시물에서 알 수 있듯이, 나는 크로스 컴파일과 동적 라이브러리를 사용하기 시작 했으므로 아마도 내 잘못은 다른 곳에서있을 수 있습니다. 게다가 문제가있는 곳을 이해할 지 모르겠다. 그래서 어떤 힌트라도 환영 받는다. 더 자세한 정보가 필요하시면, 그들에게 기꺼이 드릴 것입니다.
Greetings, Pingu
답변을 주셔서 감사합니다. mips-linux-uclibc-cpp -Wall ./dynamic_linking.c -o ./dynamic_linking을 사용하여 프로그램을 컴파일했으며 오류가 발생해도 컴파일되었습니다. 장치에서 작동하는지 내일 확인할 수 있습니다. 피드백을 드릴 것입니다. _ 대신 _는 실제로 오타였습니다. 미안합니다. – Pingu
@Pingu :하지만 조심해! 'cpp'는 GCC C++ 컴파일러의 이름이 아니며 ('g ++'또는'C++'이 될 것입니다.) C 사전 컴파일러의 이름입니다. 'dynamic_linking' 프로그램이 프리 컴파일러의 출력이 될 경우 재미있을 것입니다 ! – rodrigo
내 장치에는 gcc C++ 컴파일러가 없지만이 게시물을 읽는 것은 http : // stackoverflow입니다.com/questions/6626363/why-use-g-of-gcc-to-compile-cc-files 나는 C++ std 라이브러리를 사용하여 gcc로 코드를 컴파일하는 것이 가능하다고 생각한다. 나는 그것을 알아 내려고 노력할 것이다. – Pingu