【发布时间】:2011-07-11 20:17:48
【问题描述】:
我已经为open() 和open64( 编写了包装器)。现在我通过使用LD_PRELOAD 环境变量预加载我的包装器库来运行vi,我看到使用open64() 包装器而不是open()。但是当我 strace vi 我看到系统调用是对open() (当然包括其他系统调用)。这里有什么问题?
【问题讨论】:
我已经为open() 和open64( 编写了包装器)。现在我通过使用LD_PRELOAD 环境变量预加载我的包装器库来运行vi,我看到使用open64() 包装器而不是open()。但是当我 strace vi 我看到系统调用是对open() (当然包括其他系统调用)。这里有什么问题?
【问题讨论】:
您是否在 64 位系统上运行?如果是这样,那就不足为奇了。 strace 跟踪实际的系统调用,而不是调用库中的哪些函数。在 64 位系统上,open 和 open64 由相同的系统调用实现。
【讨论】:
strace 实用程序跟踪 system calls(系统调用)并且 open 恰好是系统调用和库函数。 open() 和 open64() 库函数在内部使用 open 系统调用从内核请求服务。据我了解,使用open() 和O_LARGEFILE 标志相当于使用open64() 来支持32 位应用程序中的大文件。
如果对open64() 的调用是在内部调用open() 函数,则不会调用您的open() 包装器,因为您无法插入内部库函数调用。它们在运行前被解析。
【讨论】: