【问题标题】:Is there a way to call the llvm `llc` command from my C project?有没有办法从我的 C 项目中调用 llvm `llc` 命令?
【发布时间】:2021-08-28 15:03:48
【问题描述】:

我正在尝试在我的 C 编译器项目中使用来自 llvm 的 llc 命令,但我不知道如何使用它。我已经尝试在 cmake 中链接 llvm 库,但如果我想要 llc,我不知道要链接哪些库。任何帮助都可以,谢谢!

【问题讨论】:

  • @MikeCAT 通常system 是不鼓励的-因为它使您无法控制创建的过程,尽管我认为它可能会根据情况起作用
  • system 如果在创建命令字符串时没有正确引用,则很危险。它使用 shell 来解析和执行命令行。试想如果您尝试将文件名 myfile; rm -rf / 传递给 llc 会发生什么。

标签: c cmake linker llvm llc


【解决方案1】:

现在它有点取决于操作系统,但是有一些方法可以通过系统外壳打开子进程

在 UNIX-y 系统下,您可以使用 popen (https://linux.die.net/man/3/popen),它允许您打开子进程并与子进程通信(在本例中为 llc)。

在 Windows 下,_popen 似乎具有类似的功能 - 尽管我从未亲自使用过它,因此您可能需要阅读 the MSDN

【讨论】:

  • 就像system 一样,popen 依赖于 shell 来解析和评估命令字符串。同样的安全考虑也适用。
  • @HAL9000 通常,调用任何可执行文件都有安全隐患,因为从您的程序的角度来看,它实际上是任意代码。出于调用链接器的目的,许多编译器使用 shell 来调用辅助程序,因此我认为它在这种情况下是可以接受的——当然,在某些情况下这是一个重要的考虑因素
  • 这与信任 llc 无关,在大多数实际应用中,它可能被视为二进制 blob。这是关于对您自己编写的程序的信任以及它处理来自不受信任来源的数据的能力。如果在处理不受信任的数据时为popensystem 创建命令字符串时不小心,攻击者可能会使用特制数据运行任意命令。这与 SQL 注入的问题基本相同。
  • @HAL9000 但这是一个编译器?输入数据本质上是用户生成的......
  • 这不是关于 llc 是编译器或处理数据。它是关于您在程序中处理的数据,并用于构建命令行以供systempopen 解析和执行。如果不受信任的用户有可能影响调用llc 时使用的优​​化标志,并使用优化标志-O;rm -rf /; 欺骗您的程序执行怎么办?由于 shell 用于解析和执行命令行,这将是不好的。通过使用fork/exec,这将是没有问题的。当程序被用作网站的后端时,这是现实世界的问题。
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2017-12-08
相关资源
最近更新 更多