2013-02-21 3 views
2

Я пытаюсь преобразовать c-программу в C++. Эта программа генерирует набор файлов «* .so», который используется в другой программе, созданной llvm. В основном генерируемый llvm код имеет обратные вызовы к текущему коду. Я загружаю их, используя LDPRELOADОшибка C-C++ при вызове функции

В качестве первого шага я просто компилирую код с помощью C++. Компиляция работала нормально. Но когда бегайте это segfaults. Существует метка dec_blk, которая должна содержать адрес функции dec_blk(). Я использую extern "C" для этой функции и ее прототипа, чтобы предотвратить демонтаж. При запуске с с версией, ярлык имеет правильный адрес, но, когда я запускаю его с C++ версии значения этого ярлыка 0. я обеспечиваю подробность ниже

LLVM кода

subq $24, %rsp 
movq dec_blk, %rax 
movq dec_blk+8, %rcx 
movq %rdi, 16(%rsp) 
movq %rcx, %rdi 
movq 16(%rsp), %rcx 
movq %rsi, 8(%rsp) 
movq %rcx, %rsi 
movq 8(%rsp), %rdx 
callq *%rax # segfaults here 

объявление функции

extern "C" 
{ 
long int dec_blk(void*, long int*, long int*); 
} 

Не могли бы вы помочь в том, что искать. Я использую gdb для отладки

+0

извините его мою опечатку – simpleuser

+0

Итак, ваша проблема решена? –

+0

@phresnel Nooooooooooooooooo :( – simpleuser

ответ

0

Существует метка dec_blk, которая должна содержать адрес функции dec_blk(). ... но, когда я запускаю его с C++ версии значения этого этикетка 0

Вашего описание соответствует этому коду (который вы не показали):

extern "C" long int dec_blk(...); 
int main() { 
    return dec_blk(); 
} 

Но разборки в ваш вопрос соответствует этому (разные) код вместо:

extern "C" long int (*dec_blk)(...); 
int main() { 
    return dec_blk(); 
} 

Эти два фрагмента являются не совсем то же самое. Я предполагаю, что вы использовали вторую функцию, когда вы хотели использовать первую.

+0

Спасибо за ответ, я проверил .... это не тот случай – simpleuser

+0

@simpleuser «это не тот случай». Вы проверили * как *? Вы вряд ли получите удовлетворительный ответ, если не предоставите дополнительные данные (и я * все еще считаю, что моя гипотеза, скорее всего, правильная, по крайней мере, это то, что выглядит скомпилированный код). –

Смежные вопросы