Unix ld:0711-224警告:重复符号(覆盖AIX中的系统调用)

Unix ld:0711-224警告:重复符号(覆盖AIX中的系统调用),unix,kernel,aix,kernel-extension,Unix,Kernel,Aix,Kernel Extension,我读了这篇(;)关于在aix中重写系统调用的文章 我写了两个内核扩展,就像文章中说的“第一个内核扩展只会用不同的名称重新导出原始系统调用。第二个内核扩展实际上会通过重新定义来覆盖系统调用,然后调用第一个模块导出的原始系统调用。” 但在进行第二次扩展时出现了一个错误: 1> gcc -O2 -maix64 -ffreestanding -o my_syscall.o -c my_syscall.c -D_KERNEL 1> ld -b64 -o my_syscall my_syscal

我读了这篇(;)关于在aix中重写系统调用的文章

我写了两个内核扩展,就像文章中说的“第一个内核扩展只会用不同的名称重新导出原始系统调用。第二个内核扩展实际上会通过重新定义来覆盖系统调用,然后调用第一个模块导出的原始系统调用。”

但在进行第二次扩展时出现了一个错误:

1> gcc -O2 -maix64 -ffreestanding -o my_syscall.o -c my_syscall.c -D_KERNEL
1> ld -b64 -o my_syscall my_syscall.o -e my_syscall_init -bI:/home/rabbitte/output/test_system/my_syscall.exp -bI:/usr/lib/kernex.exp -lsys -lcsys 
1>ld : 0711-224 warning : Duplicate symbol: .getpid
1> ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
文件“/home/rabbite/output/test\u system/my\u syscall.exp”是第一个扩展名的导出文件。 我不明白“复制符号:.getpid”是什么意思。你能告诉我怎么解决这个问题吗


非常感谢。

我从来没有这样做过,因此这可能不足以解决您的问题,但您的链接器线路有两个
-bI
选项。根据您指向的文档,AIX kernex.exp应该是
-bI
,而
exp
文件应该是
-be

原因是文件“kernex.exp”还包含符号“getpid”。我应该在kernex.exp文件中对getpid进行注释。

让我读一下这篇文章,并对它进行一些操作。通常,可以忽略重复符号警告。ld的退出状态是否为0?i、 e.echo$?作为ld之后的下一个命令。谢谢。Kernex.exp是系统导出文件。“kernex.exp”也是由第一个内核扩展导出的文件。所以这两个文件都需要use-bI。他谈到了两个内核扩展。我怀疑您在定义新getpid的那一个上得到了重复的错误。对您不需要说您将从内核获得getpid,因为您不是。我将创建一个自定义导入文件(可能为空),并从kernexp中添加第二个模块需要的符号。您还可以通过将库放入LIBPATH中而根本没有内核扩展来完成这项工作。ptrace就是这样做的。我也认为有一种方法可以一步到位。链接器是非常通用的。