【发布时间】:2015-04-27 06:16:36
【问题描述】:
我正在尝试编译一个包含对getresuid 的调用的函数。但是它会产生以下警告:
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 <sys/types.h>。您的代码在 Ubuntu 14.04 上为我编译好。您使用的是哪个版本的 Linux? -
我认为 C99 禁止隐式声明,而不是
getresuid(),这会导致混淆。 -
@Jonathan Leffler:Mac OS 10.10.2?抱歉,这可能是个愚蠢的问题,但您需要什么扩展(以及在哪里可以找到参考资料)?
-
Mac OS X 10.10.2 不是 Linux 的变体;它是 BSD 的变体。
getresuid()函数在 Mac 上根本不可用——它没有实现。您需要使用getuid()和geteuid()来表示“r”和“e”部分;我不确定有没有办法得到's'部分。请注意,在问题中准确识别平台将有助于避免陷入各种死胡同。