Что означает PFYvv? (не PFvv!) - PullRequest
0 голосов
/ 14 июня 2019

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

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

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

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

Вопросы

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

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

_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
};

1 Ответ

2 голосов
/ 14 июня 2019

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

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

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

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

...