LINUX.ORG.RU

symbol lookup error: mylib.so: undefined symbol: my_func

 


0

2

Пытаюсь выполнить функцию, содержащуюся в основном бинарнике из динамически подгруженной библиотеки и получаю сабж. Куда копать?
Функция обозначена в заголовочном файле extern-декларацией (без extern то же самое, как и без декларации вовсе) и разумеется в исходниках бинаря, в бинарнике её символ присутствует.

★★★★★

из динамически подгруженной библиотеки

Я на всякий пожарный переспрошу. Это имеется в виду всё же dlopen() + dlsym()?

c extern декларацией

extern "C" надеюсь, а не просто extern?

ilammy ★★★
()
Последнее исправление: ilammy (всего исправлений: 1)
Ответ на: комментарий от ilammy

Да, dlopen+dlsym.
extern «C» оказался не нужен т.к там С с обеих сторон, просто неправильно понимал его предназначение.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ясень пень, что gcc. Я имел в виду на который файл? На либы или бинарник?

mittorn ★★★★★
() автор топика
#!/bin/bash

rm -f main lib.so 2>/dev/null

gcc -Wl,--export-dynamic -fPIC -x c - -l dl -o main <<EOF
#include <stdio.h>
#include <dlfcn.h>
void my_func(void) {
  printf("my_func\n");
}
int main() {
  typedef void (*func)(void);
  void* lib = dlopen("./lib.so", RTLD_NOW);
  func lib_func = (func)dlsym(lib, "lib_func");
  printf("%p %p\n",lib,lib_func);
  if(lib_func)
    lib_func();
  return 0;
}
EOF

gcc -shared -fPIC -x c - -l dl -o lib.so <<EOF
#include <stdio.h>
#include <dlfcn.h>
void lib_func(void) {
  printf("lib_func\n");

  typedef void (*func)(void);
  func my_func = (func)dlsym(0, "my_func");
  printf("%p\n",my_func);
  if(my_func)
    my_func();
}
EOF

./main
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.