2014-11-21 2 views
1

Я играл с указателями функций, и у меня есть две конкретные версии, которые я напечатал на консоли; результаты говорят, что они являются 8 байт аппарт, например, так:Добавить в функцию указатель, чтобы получить указатель на другую функцию?

Function Pointer Addresses: 
rb_gc_start addr: 0x6ea81360 
rb_gc_mark addr: 0x6ea81368 

Могу ли я просто получить указатель на функцию к первому, добавить 8 к этому указателю, и есть указатель на второй функции?

Предыстория: в источнике Руби есть две функции: rb_gc_start и rb_gc_mark; Я строю библиотеку для ... сложной программы. Эта программа включает Ruby, но не API Ruby C (он отключает загрузку Ruby-расширений или * .so-файлов). Я довольно много воссоздал среду, и я могу получить адрес rb_gc_start напрямую, но rb_gc_mark не так легко разоблачить, и мне нужен указатель на него, чтобы все работало правильно.

Например:

unsigned long (*rb_gc_start)(void); 
void (*rb_gc_mark)(unsigned long); 

void my_method(void) { 
    rb_gc_start = get_method(rb_mGC, "start"); // 0x6ea81360; 
    rb_gc_mark = rb_gc_start + 8; // Does this work? 
} 

я, скорее всего, искать дурака здесь, но помощь на получение второй функции будет наиболее полезным.

+0

Откуда возникает 'func1_ptr'? – bwinata

+0

Извините, я переименовал функции в последнюю минуту, чтобы предоставить больше контекста; это должно быть 'rb_gc_start'. – FenixFyreX

ответ

0

Вы можете не делать этого, если указатели на функции не входят в один и тот же массив указателей на функции. Аддитивный оператор для указателей и интегральных значений действителен только для указателей в массиве. Один объект рассматривается как массив с одним элементом.

также принимать во внимание, что в соответствии со стандартом C (6.2.5 Типы)

28 Указатель к мочеиспусканию имеют такое же представление и согласование требований как указатель на символьный type.48) Аналогично, указатели для квалифицированных или неквалифицированных версий совместимых типов должны иметь те же требования к представлению и выравниванию. Все указатели на типы конструкций должны иметь одинаковое представление и выравнивание требований как друг друга. Все указатели на типы соединений должны иметь одинаковые требования к представлению и выравниванию . Указатели на другие типы не должны иметь одинаковые требования к представлению или выравниванию.

А (6.3.2.3 Указатели)

8 Указатель на функцию одного типа могут быть преобразованы в указатель на функцию, другого типа и обратно; результат будет сравнивать , равный исходному указателю. Если преобразованный указатель используется для , вызовите функцию, тип которой несовместим со ссылочным типом, поведение не определено.

+0

Есть ли что-нибудь, что вы можете мне предложить? Среда Ruby - это DLL, встроенная в свою программу, поэтому я не могу получить к ней доступ; есть ли способ получить дескриптор этой функции? – FenixFyreX

+0

@FenixFyreX Функции имеют несовместимые типы, поэтому я даже не знаю, что предложить. –