Я пытаюсь скомпилировать функцию, содержащую вызов getresuid
. Однако он генерирует следующее предупреждение:Является ли getresuid устаревшим в c99?
setuid.c:8:3: warning: implicit declaration of function 'getresuid' is invalid
in C99 [-Wimplicit-function-declaration]
getresuid(&ruid, &euid, &suid);
^
Undefined symbols for architecture x86_64:
"_getresuid", referenced from:
_main in setuid-ba46f8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
Почему существует ошибка компоновщика с указанием символа, не найденного для архитектуры x86_64? Как вы его успешно связываете?
Если это поможет, мой исходный код был:
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
uid_t euid, ruid, suid;
getresuid(&ruid, &euid, &suid);
printf("EUID: %d, RUID: %d, SUID: %d\n", euid, ruid, suid);
return 0;
}
Я пытаюсь скомпилировать на Mac OS X 10.10.2 (Yosemite).
Прямой ответ: «Нет,' getresuid() 'просто не является частью C99 - ни POSIX 2008 (2013)». Поэтому, чтобы использовать его, вы должны использовать расширение для конкретной платформы. Вам не нужно '#include' в вашем коде. Ваш код компилируется для меня на Ubuntu 14.04. Какую версию Linux вы используете? –
Я думаю, что C99 запрещает неявные объявления, а не 'getresuid()', что вызывает путаницу. – myaut
@ Джонатан Леффлер: Mac OS 10.10.2? Извините, это может быть глупый вопрос, но какое расширение вам нужно (и где вы можете найти ссылки)? – lingz