文件/调用替换,如LD_PRELOAD

时间:2013-05-03 01:58:54

标签: linux bash system-calls utility

是否有通常的实用程序可以替换某些调用,例如 execve open ?像LD_PRELOAD一样用于通话。

示例:

  • 我们 prog_A 使用 prog_B
  • 前几天 prog_B 已更新,现在 prog_A 失败!(
  • 通常的解决方案是下一个:

    $: mv /usr/bin/prog_b /usr/bin/prog_B.new
    $: ln -s /usr/bin/prog_b.old /usr/bin/prog_b
    $: ./prog_a                                       # now run 
    

    但有时这是一个令人不安和肮脏的解决方案。在某些故事中,正确的方法是这样做:

    $: util "execve+open+stat:/usr/bin/prog_b=/usr/bin/prog_b.old" ./prog_a
    

    execve,open& stat是系统调用。这个util的名称是什么?

    2 个答案:

    答案 0 :(得分:1)

    我只是编写了一个特殊的FILE_PRELOAD实用程序来解决我的问题。

    $: FILE_PRELOAD -C "execve+open+stat:/usr/bin/prog_b:/usr/bin/prog_b.old" ./prog_a
    

    它生成c ++代码,然后在运行./prog_a之前编译它然后LD_PRELOAD结果lib.so文件。

    使用它可以挂接下一个电话:

    1. 开,的fopen,fopen64
    2. 执行opendir,MKDIR,命令rmdir
    3. execve
    4. 解除连结,unlinkat
    5. 统计,LSTAT,lstat64,_ lxstat, _lxstat64,stat64中
    6. _ xstat, _xstat64,__ fxstatat
    7. freopen函数,freopen64
    8. 请先运行docs/tut.sh(这是FP实用程序的教程)。

    答案 1 :(得分:0)

    通用解决方案是符号链接解决方案。它不脏。例如,请查看debianUbuntu。他们为此目的/etc/alternatives

    以下是viewUbuntu命令的示例列表:

    user@server ls -al /usr/bin/view
    lrwxrwxrwx 1 root root 22 Dez  5  2009 /usr/bin/view -> /etc/alternatives/view
    user@server ls -al /etc/alternatives/view
    lrwxrwxrwx 1 root root 18 Dez  5  2009 /etc/alternatives/view -> /usr/bin/vim.basic