【问题标题】:Using makefile, LD_PRELOAD to executable file使用 makefile,LD_PRELOAD 到可执行文件
【发布时间】:2015-06-02 11:28:57
【问题描述】:

我有两个文件,“abc.c”和“run”

我想制作一个可执行的二进制文件,执行以下两条指令

gcc -m32 -O2 -Wall -DRUNTIME -shared -fPIC -o a.so abc.c -ldl
LD_PRELOAD="a.so" ./run

我尝试在linux中使用makefile,但失败了。

我可以使用makefile制作可执行的二进制文件吗?

【问题讨论】:

  • 在 makefile 中执行此操作就可以了。 (为此,您需要两个目标。)您尝试过什么?
  • 我很好奇你为什么要使用 LD_PRELOAD,这通常用于覆盖系统库。 a.so 对我来说听起来不像是系统库。

标签: c linux shell makefile


【解决方案1】:

理想情况下,makefile 应该用于编译。要自动执行 shell 命令,您可以使用 shell 脚本。

也许,在您的情况下,您可以编写一个 shell 脚本,该脚本将首先调用 make -f <SomeMakeFile> 命令来编译和生成库 (.so),然后使用 LD_PRELOAD 指令运行目标二进制文件。

【讨论】:

  • 都是正确的,但是有一个 makefile 目标以测试/调试方式运行某些东西并不是不合理的。
  • 我同意 Etan,make test 是一种非常可行的方法。我在很多公司都用过很多次。
【解决方案2】:

我会这样做:

all: a.so

test: a.so
        LD_PRELOAD="a.so" ./run

a.so: abc.c
        gcc -m32 -O2 -Wall -DRUNTIME -shared -fPIC -o a.so abc.c -ldl

clean:
        rm -f a.so

将其保存在名为 Makefile 的文件中。请注意,缩进必须是单个制表符 - stackoverflow 在上面的输出中破坏了它。 现在有 4 个目标,仅调用 make 将生成共享库,显式调用 make test 将运行您的测试。如果需要,make test 将首先构建库。 我很想增加一些灵活性,但这不是你要求的......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2013-03-12
    • 1970-01-01
    • 2021-08-28
    • 2017-07-08
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多