【问题标题】:ld : 0711-224 warning : Duplicate symbol (Overriding a System Call in AIX)ld:0711-224 警告:重复符号(覆盖 AIX 中的系统调用)
【发布时间】:2014-01-13 11:58:53
【问题描述】:

我读过这篇文章 (http://qasim.zaidi.me/2009/05/overriding-system-call-in-aix.html;) 关于在 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/rabbitte/output/test_system/my_syscall.exp”是第一个扩展的导出文件。 我不明白“重复符号:.getpid”是什么意思。你能告诉我如何解决这个问题吗?

非常感谢。

【问题讨论】:

  • 让我读一下这篇文章并玩一下。很多时候,可以忽略重复符号警告。 ld的退出状态是0吗?即回声$?作为 ld 之后的下一个命令。

标签: unix kernel aix kernel-extension


【解决方案1】:

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

【讨论】:

  • 我读过这篇文章。他谈到了两个内核扩展。我怀疑您在定义新 getpid 的那个上遇到了重复错误。是的......你不需要说你会从内核中获得 getpid,因为你不是。我将创建一个自定义导入文件(可能为空)并添加来自 kernexp 的第二个模块需要的符号。您也可以使用放入 LIBPATH 并且根本没有内核扩展的库来做这个诡计。 ptrace 执行此操作。我也认为有一种方法可以一步完成。链接器用途广泛。
【解决方案2】:

我从来没有做过这些,所以这可能不足以解决您的问题,但是您的链接器行有两个 -bI 选项。根据您指向的文档,对于 AIX kernex.exp,它应该是 -bI,对于您的 exp 文件应该是 -bE

【讨论】:

  • 谢谢。 Kernex.exp 是系统导出文件。而“kernex.exp”也是第一个内核扩展导出的文件,所以这两个文件都需要使用-bI。
猜你喜欢
  • 2012-02-25
  • 2011-12-10
  • 2011-08-31
  • 2014-01-26
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多