首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核使错误"arch/x86/entry/syscall_64.o:(.rodata+0x1120):未定义的引用

内核使错误"arch/x86/entry/syscall_64.o:(.rodata+0x1120):未定义的引用
EN

Stack Overflow用户
提问于 2022-01-09 18:58:02
回答 1查看 661关注 0票数 0

此错误将停止内核生成进程。

代码语言:javascript
复制
ld: arch/x86/entry/syscall_64.o:(.rodata+0x1120): undefined reference to `__x64_sys_fd'
  BTF   .btf.vmlinux.bin.o
pahole: .tmp_vmlinux.btf: No such file or directory
  LD    .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: file not recognized: file format not recognized

下面是我在linux内核源代码中修改的文件

fd.c

代码语言:javascript
复制
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/fdtable.h>
#include <linux/pid.h>
#include <linux/sched/signal.h>
#include <linux/fs.h>

SYSCALL_DEFINE4(fd, pid_t, pid_input, struct fdtable*, fd, struct files_struct*, files, struct file*, f)
{
    struct pid* result_pid;
    struct task_struct* rt;
    result_pid = find_get_pid(pid_input);
    rt = get_pid_task(result_pid, PIDTYPE_PID);
    files = rt->files;
    *fd = files->fdtab;
    f = files->fd_array[0];
    printk(KERN_INFO "--------------------fd---------------------\n");
    printk(KERN_INFO " Maximum number of current file objects: [%d]", fd->max_fds);
    printk(KERN_INFO " Point to the file descriptor that needs to be closed when executing exec( )[%ld]", *(fd->close_on_exec));
    printk(KERN_INFO " Pointer to open file descriptor: [%ld]", *(fd->open_fds));
    printk(KERN_INFO " Next allocated file descriptor:[%d]", files->next_fd);
    printk(KERN_INFO "--------------------fdinfo-----------------\n");
    printk(KERN_INFO " The flag specified when opening the file: [%d]",f->f_flags);
    printk(KERN_INFO " The cursor postion value: [%lld]",f->f_pos);
    return 0;
}

fd dir中的Makefile

代码语言:javascript
复制
obj-y := fd.o

linux dir中的Makefile

代码语言:javascript
复制
core-y       += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ fd/

arch/x86/entry/syscalls/

代码语言:javascript
复制
335    64    fd          sys_fd

包括/linux/

代码语言:javascript
复制
asmlinkage long sys_fd(pid_t pid_input, struct fdtable* fd, struct files_struct* files, struct file* f);
EN

回答 1

Stack Overflow用户

发布于 2022-05-18 12:08:13

perphas,在文件中:

arch/x86/entry/syscalls/syscall_64.tbl

您应该使用这样的写方式:

代码语言:javascript
复制
335    64    fd          __x64_sys_fd

而不是我们sys_fd

因为linux4.17添加了一个新的系统调用,所以必须在__x64_sys_文件中启动syscall_64.tbl

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70644512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档