2015-04-27 33 views
2

我试图编译一个包含调用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(优胜美地)。

+1

直接的答案是 “否;'getresuid()'根本就不是C99的一部分 - 2008年也不POSIX(2013年)的”。所以要使用它,你必须使用特定于平台的扩展。你不需要'#include '在你的代码中。你的代码在Ubuntu 14.04上编译OK。你在使用哪个版本的Linux? –

+1

我认为C99禁止隐式声明,而不是'getresuid()',这会导致混淆。 – myaut

+0

@Jonathan Leffler:Mac OS 10.10.2?对不起,这可能是一个愚蠢的问题,但你需要什么样的扩展(以及哪里可以找到引用)? – lingz

回答

2

你需要的所有头

#define _GNU_SOURCE 

getresuid是GNU扩展函数之前定义。

+0

我在原始代码中完成了这项工作。它仍然会给出同样的错误。 – lingz

+0

@cathy: - 您是否尝试在GCC选项中添加'-D_GNU_SOURCE'?还要确保你在文件中的所有标题前加了#define _GNU_SOURCE。 –

+0

是的。我确实阅读了另一篇SO帖子,其中提到了所有这些内容。我相信我上面的错误的主要区别是链接器错误。相关的SO职位是这一个:http://stackoverflow.com/questions/19721810/warning-implicit-declaration-of-function-getresuid-and-seteuid?rq=1 – lingz

1

直接的答案是 “否; getresuid()根本就不是C99的一部分 - 2008年也不POSIX(2013年)的”。因此,要使用它,您必须使用特定于平台的扩展,并且它不适用于所有平台。

顺便说一句,你并不需要在你的代码#include <sys/types.h>

你的代码在Ubuntu 14.04上编译OK。但是,它无法在Mac OS X 10.10.3(Yosemite)上编译,该文件是从BSD派生而不是Linux派生的。在平台上,getresuid()函数根本不可用 - 没有实现。您需要为'r'(真实UID)和'e'(有效UID)信息使用getuid()geteuid();我不认为有一个明智的方法来获取's'(已保存的UID)信息。大多数时候,三个UID值是相同的。只有一个预计要使用'setuid'位设置的程序需要担心这些,这些程序可能需要担心已保存的UID。但是,您可能仅限于在程序启动时检查有效的UID;这是已保存的UID。