簡體   English   中英

syscall(SYS_getuid) 從 getuid() 返回不同的結果

[英]syscall(SYS_getuid) returns different result from getuid()

我想使用系統調用來獲取當前用戶的 id。 我試過這樣:

#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int uid = syscall(SYS_getuid);
    
    printf("%d\n", uid);
    
    return 0;
}

我用 root 執行它,但它打印-1而不是0

如果我將其替換為int uid = syscall(SYS_getuid); ,然后它正確返回0 我錯了什么? 如何使用syscall獲取當前用戶 ID?

我在i686/ubuntu docker 映像上運行它,因為我必須創建 32 位可執行文件。


最小的可重現示例:

Dockerfile

FROM i686/ubuntu

RUN apt-get update
RUN apt-get install --assume-yes --no-install-recommends --quiet \
        gcc libc6-dev
RUN apt-get clean all

main.c

#include <unistd.h>
#include <sys/syscall.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[])
{
    
    int uid = syscall(SYS_getuid);//getuid();//
    
    if(uid == -1)
        printf("Error: %s\n", strerror(errno));
    
    printf("%d\n", uid);
    
    return 0;
}

運行(在 x64 Windows10 上):

docker build --platform linux/386 -t my-gcc .
docker run --platform linux/386 --rm -v ${pwd}:/usr/local/src/:rw my-gcc gcc -m32 -xc /usr/local/src/main.c -o /usr/local/src/main
docker run --platform linux/386 --rm -v ${pwd}:/usr/local/src/:rw my-gcc /usr/local/src/main

結果是:

Error: Function not implemented
-1

每個getuid(2)

最初的 Linux getuid() 和 geteuid() 系統調用僅支持 16 位用戶 ID。 隨后,Linux 2.4 增加了 getuid32() 和 geteuid32(),支持 32 位 ID。 glibc getuid() 和 geteuid() 包裝函數透明地處理 kernel 版本之間的變化。

顯然,您正在 kernel 上運行程序,該程序已編譯出舊的getuid系統調用,並且 x86-32 上只有getuid32可用。 如果您運行fgrep CONFIG_UID16 "/boot/config-$(uname -r)" ,您將能夠查看您運行的 kernel 是否支持 16 位系統調用。 如果此命令打印CONFIG_UID16=y以外的任何內容,則表示舊的系統調用不可用。

如果您改為調用SYS_getuid32 ,它應該可以正常工作。 請注意, SYS_getuid32可能無法在其他架構上使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM