LINUX.ORG.RU

Вынесу в отдельную ветку.


0

0

Проблемный кусок кода такой:

typedef void (*ksfree_t)(void* ptr);
typedef void* (*ksmalloc_t)(size_t size, char* type);
typedef void (*neuro_unref_t)(neuro_t* neuro);
ksfree_t ksfree;
ksmalloc_t ksmalloc;
neuro_unref_t neuro_unref;

void init()
{
	void* handle = dlopen(NULL, RTLD_NOW);
	ksfree = dlsym(handle, "ksfree");
	ksmalloc = dlsym(handle, "ksmalloc");
	neuro_unref = dlsym(handle, "neuro_unref");
}

Присваивание значения глобальной переменной вызывает ошибку, если определить все как локальные переменнуые то присваивание ошиок не вызывает, но в остальных случаях глобальные переменные принимают значения безSegFault, да и вообще должны работать.

Что я делаю не так? Нельзя создавать глобальные указатели на функции?

★★

Ответ на: комментарий от zh

ну если очень хочется, озбови этих товарищей:
ksfree_t ksfree;
ksmalloc_t ksmalloc;
neuro_unref_t neuro_unref;

pksfree, pksmalloc, pneuro_unref соответственно.

zh
()
Ответ на: комментарий от zh

>pksfree, pksmalloc, pneuro_unref соответственно.

охренительное рядом. помогло. а что было не так? каким боком символы из моей so-шки конфликтовали с символами из основного модуля?

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

>передавай указатели

+1. В с++ еще делал такую штуку с помощью костылй из виртуальных методов класса. Т.е. реализация методов подсовывалась не на стадии компиляции/линковки, а во время исполнения программы, и она вытягивалась из основной программы. Во всяком случае я понял работу своего костыля именно так).

staseg ★★★★★
()

Я на твой вопрос ответил в предыдущей теме. У тебя происходит запись по адресу по которому нельзя писать.

Reset ★★★★★
()

не злоупотребляй

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