【发布时间】:2016-10-20 18:06:27
【问题描述】:
我正在开发用于渲染视觉效果和动画的云平台。我们接受各种格式的场景描述渲染它们,并将图像输出返回给用户。处理后端是Linux。有时我们会收到在 Windows 上生成的场景描述,因此我们会得到类似于“C:\path\to\file.mb”的路径。我编写了一个 Linux 共享库来拦截各种文件系统调用并将路径更改为 Linux 可以理解的“/C/path/to/file”。我使用 LD_PRELOAD 机制将我的函数插入到“真实”函数之前,并且效果很好……除非它没有。
例如这个命令:
LD_PRELOAD=/home/robert/path_fix.so 渲染 -s 1 -e 1 C:\path\to\test_scene_03_vray.ma
不会找到 test_scene_03_vray.ma。这也不起作用:
LD_PRELOAD=/home/robert/path_fix.so echo test > C:\path\to\test.txt
我一直在使用 ltrace 来确定哪些函数是通过引用路径名来调用的,但是这些示例没有显示在我的跟踪中:
ltrace -f -C -S -o ltrace.out 渲染 C:\path\to\test_scene_03_vray.ma
是否有除 ltrace 之外的工具可以让我查看调用了哪些函数调用?
这是我已经覆盖的列表:
- 打开
- 免费开放
- 打开目录
- 打开
- 创建
- 打开
- 统计
- lstat
- fstatat
- __lxstat
- __xstat
- mkdir
- mkdirat
- 取消链接
- 取消链接
- 访问
- faccessat
- 重命名
- 重命名
- 重命名2
- chmod
- fchmodat
- chown
- lchown
- fchownat
- 链接
- 链接
- name_to_handle_at
- 阅读链接
- readlinkat
- 符号链接
- 符号链接
- rmdir
- chdir
这里还有更多我缺少的功能吗?我试图实现所有需要
const char *文件路径
作为论据。
附带问题:这似乎已经是一个已解决的问题......是否有将 Windows 路径转换为 unix 友好路径的库或其他方法?请记住,渲染应用程序是第 3 方专有二进制文件,因此我无法修改它们。
感谢您的任何建议!
【问题讨论】:
-
名称中的
\t序列是否会导致问题?如果将名称用单引号括起来会怎样? -
你可能不需要像
fopen()那样修改stdio函数。他们最终会调用 Unix 函数open(),所以他们会自动调用替换函数。
标签: c linux ld-preload