2013-05-03 76 views
2

是否有一些常用工具可以替代某些调用,如execve打开?像调用LD_PRELOAD一样。类似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 
    

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

    +0

    为什么不使用'LD_PRELOAD'? – hek2mgl 2013-05-03 02:12:19

    +0

    * util *使用它。如果我将使用LD_P ...首先我必须编写对我有用的函数,然后编译它,然后写LD_PRELOAD =“./ wrap_calls.so”./prog_a。我们只想做这个链条的最后一步。 – 2013-05-03 02:17:00

    +0

    你只需要一个封装'execve','open','stat'的库。然后使用'LD_PRELOAD yourlib。/ prog_a'。不需要'util'。或者我错过了什么?如何创建该库需要帮助吗? – hek2mgl 2013-05-03 02:24:35

    回答

    1

    我只写一个特殊FILE_PRELOAD工具来解决我的问题。

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

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

    使用它可以将下一个呼叫:

    1. 开放,FOPEN,fopen64
    2. 执行opendir,MKDIR,命令rmdir
    3. execve的
    4. 取消链接,unlinkat
    5. 统计,LSTAT,lstat64 ,_ lxstat, _lxstat64,stat64
    6. _ xstat, _xstat64,__ fxstatat
    7. freopen函数,freopen64

    请运行docs/tut.sh首先(这对FP实用的教程)。

    0

    常见问题解决方案是符号链接解决方案。它不肮脏。例如,看看debianUbuntu。他们有/etc/alternatives为此目的。

    这里谈到一个例子上Ubuntuview指令列出:

    [email protected] ls -al /usr/bin/view 
    lrwxrwxrwx 1 root root 22 Dez 5 2009 /usr/bin/view -> /etc/alternatives/view 
    [email protected] ls -al /etc/alternatives/view 
    lrwxrwxrwx 1 root root 18 Dez 5 2009 /etc/alternatives/view -> /usr/bin/vim.basic 
    
    +0

    符号链接不肮脏,但有些时候没用。例如,我们有prog_a和prog_c,它们使用不同版本的prog_b。你会怎么做? – 2013-05-03 02:44:48

    +0

    我会安装所有程序的正确版本。但是,我知道现实生活中的这种情况;)..你能告诉你为什么你无法清理那场灾难的原因吗? – hek2mgl 2013-05-03 02:46:07

    +0

    许多年前创建的一些程序。他们可爱但想要一些旧东西。 – 2013-05-03 02:50:14