Я пытаюсь собрать старый binutils (2.13). получение ошибки ./config/obj-elf.c:364: ошибка: неверный аргумент типа «->» (имеет «int») в следующей строке:
if (symbol_get_obj (symbolP)->local)
{...
функция symbol_get_obj:
OBJ_SYMFIELD_TYPE *
symbol_get_obj (s)
symbolS *s;
{
if (LOCAL_SYMBOL_CHECK (s))
s = local_symbol_convert ((struct local_symbol *) s);
return &s->sy_obj;
}
OBJ_SYMFIELD_TYPE определяется как:
#define OBJ_SYMFIELD_TYPE struct elf_obj_sy
и elf_obj_sy это
struct elf_obj_sy
{
/* Whether the symbol has been marked as local. */
int local;
/* Use this to keep track of .size expressions that involve
differences that we can't compute yet. */
expressionS *size;
/* The name specified by the .symver directive. */
char *versioned_name;
#ifdef ECOFF_DEBUGGING
/* If we are generating ECOFF debugging information, we need some
additional fields for each symbol. */
struct efdr *ecoff_file;
struct localsym *ecoff_symbol;
valueT ecoff_extern_size;
#endif
};
не мог понять, что не так с этим кодом … любой совет?
Основываясь на сообщении об ошибке, одной из возможных причин является то, что объявление функции symbol_get_obj
не появляется до место, которое вы называете, что делает возвращаемое значение по умолчанию для типа int
недопустимый тип для оператора ->
, Вы можете проверить это. Убедитесь в правильном присутствии symbol_get_obj
объявление через включение заголовочного файла или явный прототип функции.
invalid type argument of ‘->’ (have ‘int’)
Это может иметь смысл, только если
symbol_get_obj(symbolP)
возвращается int
, Что это не так.
Итак, единственный логический вывод заключается в том, что symbol_get_obj
не был объявлен в той точке кода, где произошла ошибка. В этом случае компилятор будет считать, что это функция, которая возвращает значение типа int
, Что бы потом объяснить сообщение об ошибке.