Что означает PFYvv? (не ПФВВ!)

Я пытаюсь связать файл символа с искаженными сгенерированными из заголовка. (сопоставление функций, расположенных в ПЗУ, с функциями в ОЗУ.)

В .sym у меня есть функция с параметром "PFvv", обычно деманглированная на -> VOID (fn*)(VOID).

Вместо этого компилятор выдает в качестве параметра следующий вывод: PFYvv

Результат: компоновщик не связывается.

Вопросы:

Что означает Y? Есть ли справочный документ по искажению ARM?

.sym искаженное имя:

_ZN10CCasd15lolEP13strPcPFvvEhPvm

сгенерированное компилятором имя:

_ZN10CCasd15lolEP13strPcPFYvvEhPvm

.h определение

class CCasd{
    static int lol(in_str*h, char* name, void(*fn)(void), unsigned char p, void *s, unsigned long l);
};

КОД ОТВЕТА ПОСЛЕ:

Вот как вы можете сгенерировать искаженные имена PFvv и PFYvv:

#ifdef          __cplusplus
extern  "C" {                               /* C declarations in C++     */
#endif

class CCASD {
public:
    static int lol(in_str*h, char* name, void(*fn)(void), unsigned char p, void *s, unsigned long l);//Will be PFYvv
};

#ifdef          __cplusplus
}                                           /* End of C declarations     */
#endif

class CCASD {
public:
    static int lol(in_str*h, char* name, void(*fn)(void), unsigned char p, void *s, unsigned long l);//Will be PFvv
};

person Kons    schedule 14.06.2019    source источник


Ответы (1)


По-видимому, ABI ARM основан на более распространенном Itanium. ABI (с некоторыми изменениями, перечисленными в связанном документе).

Итак, мы направляемся туда и обнаруживаем, что Y исходит из <function-type> производства вашего " указатель на функцию" со следующим пояснением:

Префикс «Y» для простого типа функции кодирует extern «C» в реализациях, которые различают типы функций с языковой связью «C» и «C++». Это влияет только на изменение типа, поскольку внешние объекты функций "C" имеют неизмененные имена.

Что касается того, есть ли у вас одна из этих реализаций (я имею в виду в целом; очевидно, что ваша одна из них), этот ответ стоит прочитать.

person Lightness Races in Orbit    schedule 14.06.2019
comment
Спасибо, вы делаете это довольно просто, но, не зная много о коверкании, было трудно искать! :) - person Kons; 14.06.2019
comment
Кроме того, было бы полезно иметь практический пример разницы двух возможных объявлений. - person Kons; 14.06.2019
comment
В вопрос добавлен фрагмент кода для генерации обоих случаев! - person Kons; 14.06.2019
comment
@Kons: Пожалуйста. Единственное, что я искал, это ARM ABI. Остальное просто читал и следил за подсказками. Люди слишком полагаются на поиск, чтобы сразу перейти к ответу; Я действительно думаю, что им следует больше учиться! Проводя вас через мой процесс, я надеялся показать ценность этого. Кроме того... в вопросе, на который я вас связал, есть пример, и я предложил его прочитать;) - person Lightness Races in Orbit; 15.06.2019
comment
Я готов ко всему, что вы написали, и, хотя я инженер встроенного C, мне никогда не приходилось так внимательно смотреть на искажения C ++. Я бы никогда не искал ARM ABI :D в первую очередь! Еще раз спасибо :) - person Kons; 16.06.2019