2015-04-27 2 views
2

Я пытаюсь скомпилировать функцию, содержащую вызов 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).

+1

Прямой ответ: «Нет,' getresuid() 'просто не является частью C99 - ни POSIX 2008 (2013)». Поэтому, чтобы использовать его, вы должны использовать расширение для конкретной платформы. Вам не нужно '#include ' в вашем коде. Ваш код компилируется для меня на Ubuntu 14.04. Какую версию Linux вы используете? –

+1

Я думаю, что C99 запрещает неявные объявления, а не 'getresuid()', что вызывает путаницу. – myaut

+0

@ Джонатан Леффлер: Mac OS 10.10.2? Извините, это может быть глупый вопрос, но какое расширение вам нужно (и где вы можете найти ссылки)? – lingz

ответ

2

Вам нужно определить, прежде чем все заголовки

#define _GNU_SOURCE 

в getresuid является функция расширения GNU.

+0

Я сделал это в своем исходном коде. Он по-прежнему дает ту же ошибку. – lingz

+0

@cathy: - Вы пытались добавить '-D_GNU_SOURCE' в опции GCC? Также убедитесь, что вы добавили '#define _GNU_SOURCE' перед всеми заголовками в вашем файле. –

+0

Yup. Я прочитал еще один пост, который предложил все эти вещи. Я считаю, что основное различие в моей ошибке выше - ошибка компоновщика. Соответствующая публикация SO следующая: http://stackoverflow.com/questions/19721810/warning-implicit-declaration-of-function-getresuid-and-seteuid?rq=1 – lingz

1

Прямой ответ: «Нет, getresuid() просто не является частью C99 - ни POSIX 2008 (2013)». Поэтому, чтобы использовать его, вы должны использовать расширение для платформы, и оно не доступно на всех платформах.

Кстати, вам не нужно #include <sys/types.h> в вашем коде.

Ваш код компилируется ОК для меня на Ubuntu 14.04. Однако он не скомпилируется в Mac OS X 10.10.3 (Yosemite), который получен из BSD, а не из Linux. Функция getresuid() просто недоступна - не реализована - на платформе.

Вам необходимо использовать getuid() и geteuid() для информации «r» (настоящий UID) и «e» (эффективный UID); Я не думаю, что есть разумный способ получить информацию о 's' (сохраненном UID). В большинстве случаев три значения UID одинаковы. Только программа, ожидающая запуска с набором бит setuid, должна беспокоиться об этом, и такие программы могут беспокоиться о сохраненном UID. Однако, вероятно, вы ограничены проверкой эффективного UID при запуске программы; это сохраненный UID.

 Смежные вопросы

  • Нет связанных вопросов^_^