C 使用LD_预加载的帮助

C 使用LD_预加载的帮助,c,linux,C,Linux,我想用修改后的printf版本创建一个库,然后调用LD_PRELOAD,这样当我的程序调用printf时,它会使用我的版本。有人能给我解释一下如何使用LD_PRELOAD,以及我的代码或库中是否需要做一些特殊的事情吗 这似乎是个坏主意。为什么不把你的版本命名为printf呢?这似乎是个坏主意。为什么不将您的版本命名为printf其他名称?您只需将环境变量LD_PRELOAD设置为替换库的完整路径。由于在此之后启动的所有程序都将尝试使用此库,因此您可能需要创建一个包装器脚本,该脚本设置LD\u P

我想用修改后的printf版本创建一个库,然后调用LD_PRELOAD,这样当我的程序调用printf时,它会使用我的版本。有人能给我解释一下如何使用LD_PRELOAD,以及我的代码或库中是否需要做一些特殊的事情吗

这似乎是个坏主意。为什么不把你的版本命名为printf呢?

这似乎是个坏主意。为什么不将您的版本命名为printf其他名称?

您只需将环境变量
LD_PRELOAD
设置为替换库的完整路径。由于在此之后启动的所有程序都将尝试使用此库,因此您可能需要创建一个包装器脚本,该脚本设置
LD\u PRELOAD
,然后调用要运行的程序。

您只需将环境变量
LD\u PRELOAD
设置为替换库的完整路径。由于在此点之后启动的所有程序都将尝试使用此库,因此您可能需要创建一个包装器脚本,设置
LD_PRELOAD
,然后调用要运行的程序

  • 据我所知,首先,该程序不能更改活动uid或gid(所谓的suid或guid程序)
  • 它应仅用于特定目的,如调试。据我所知,您可以在C语言中对函数进行阴影处理(在elf中?)。然而,这两种技术-
    LD_预加载
    和阴影处理都应该格外小心。我记得当GLib内部发生变化时,我在gpgme代码(或其他与gpg相关的代码)中的shadowing
    g_malloc
    中发现了bug 答案很简单——不要这样做。更复杂的是——当且仅当您必须这样做时才这样做——通常您不会这样做(除非您编写了某种调试软件)

  • 据我所知,首先,该程序不能更改活动uid或gid(所谓的suid或guid程序)
  • 它应仅用于特定目的,如调试。据我所知,您可以在C语言中对函数进行阴影处理(在elf中?)。然而,这两种技术-
    LD_预加载
    和阴影处理都应该格外小心。我记得当GLib内部发生变化时,我在gpgme代码(或其他与gpg相关的代码)中的shadowing
    g_malloc
    中发现了bug 答案很简单——不要这样做。更复杂的是——当且仅当您必须这样做时才这样做——通常您不这样做(除非您编写某种调试软件)。

    或我最喜欢的方式(使用sh或bash):LD_PRELOAD=/path/to/lib./myProg或我最喜欢的方式(使用sh或bash):LD_PRELOAD=/path/to/lib./myProg