【问题标题】:Linking to multiple libraries, one of which wraps a set of system calls链接到多个库,其中一个包含一组系统调用
【发布时间】:2012-09-14 06:34:04
【问题描述】:

这就是我正在研究的场景:

我有 3 个库 - A、B 和 C。

  • 库 A 实现函数 foo() 并将其公开为 API。
  • 函数foo() 调用POSIX write() 调用以写入一些数据。
  • 库 B 使用链接器 -wrap 选项将包装器写入 write() glibc 调用。
  • 库 C 链接到 A 和 B。

库 C 进行的任何 write() 调用都将被包装器拦截 库B。但是,我的问题是,如果库C调用foo(),foo()中的write()调用会被B拦截吗?

【问题讨论】:

  • 尝试编写代码,看看会发生什么,这就是我会做的。
  • glibc write 函数是真正系统调用的包装器。
  • 谢谢你,@JonathanCruz。这些是我正在谈论的假设库,并且包装库在这种情况下的行为将是决定我是否应该开始编写它的决定因素。但是,我现在正在研究一个较小的测试用例。我只是认为转向 stackoverflow 可能会得到更快的响应:)
  • 天啊。关于 SO 的一个好问题。赞成。
  • 您可以访问您的库的源代码吗?您是否期待某处出现恶意行为?不要忘记库可以在调用任何函数的情况下执行write 系统调用(特别是包装write(2) 系统调用的Glibc 中的write 函数)-e.g.只是通过巧妙的asm 序列使用sysenter。见stackoverflow.com/a/11609768/841108

标签: c linux linker posix ld


【解决方案1】:

如果A-wrap=write 链接,foo 将调用包装器。如果不是,则不会。

C 中调用write 也是如此。就调用write 而言,AC 之间没有任何区别。

【讨论】:

  • 谢谢,这正是我想知道的!
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多