LLVM JIT编译的程序找不到外部函数

2023-11-29

我的程序 JIT 编译 LLVM IR 模块并调用函数foo如果其中定义在运行时失败foo使用外部定义的函数:

LLVM ERROR: Program used external function 'glutInit' which could not be resolved!

我的程序:

// foo1.cpp
#include <GL/glut.h>

extern "C" void foo()
{
  glutInit(0,0);
}

// foo2.cpp
#include <iostream>
#include <fstream>
#include <string>

#include <llvm/Support/raw_ostream.h>
#include <llvm/LLVMContext.h>
#include <llvm/Support/TargetSelect.h>
#include <llvm/Support/IRReader.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/ExecutionEngine/JIT.h>
#include <llvm/ExecutionEngine/RuntimeDyld.h>

int main(int argc, char **argv)
{
  using namespace llvm;
  InitializeNativeTarget();

  LLVMContext context;
  SMDiagnostic error;

  std::ifstream ir_file("foo1.s");
  std::string ir((std::istreambuf_iterator<char>(ir_file)),
                 (std::istreambuf_iterator<char>()));

  Module *m = ParseIR(MemoryBuffer::getMemBuffer(StringRef(ir)), error, context);
  if(!m)
  {
    error.print(argv[0], errs());
  }

  ExecutionEngine *ee = ExecutionEngine::create(m);

  Function *func = ee->FindFunctionNamed("foo");
  if(func == 0)
  {
    std::cerr << "Couldn't find Function foo" << std::endl;
    std::exit(-1);
  }

  typedef void (*fcn_ptr)();
  fcn_ptr foo = reinterpret_cast<fcn_ptr>(ee->getPointerToFunction(func));
  foo();
  delete ee;

  return 0;
}

以下是我构建程序的方法:

$ clang -S -emit-llvm foo1.cpp
$ g++ -rdynamic foo2.cpp `llvm-config --cxxflags` `llvm-config --libs` `llvm-config --ldflags` -lglut

输出:

$ ./a.out 
LLVM ERROR: Program used external function 'glutInit' which could not be resolved!

每当我尝试使用 C++ 标准库中不存在的外部定义函数(例如,printf, malloc, & free没问题)。我究竟做错了什么?


确保glutInit被链接到a.out。如果您的主机代码(执行 JIT 的代码)没有调用它,则它可能已被链接器取消。如果是这种情况,您必须添加对其的虚拟引用或使用链接描述文件/标志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM JIT编译的程序找不到外部函数 的相关文章

随机推荐

  • 使用 .setPaint(gradient) 调整大小时不重新绘制

    一旦我在代码中使用渐变 在调整大小时重新绘制就不会完成 我在调整大小时会得到类似的结果 已调整大小的黑色矩形 请参阅下面链接中的图像 当我停止调整大小时 所有内容都会再次绘制 但只有那时 如果我不使用g2d setPaint gradien
  • 如何安排从 BigQuery 表导出到 Cloud Storage?

    我已在 BigQuery 中成功安排查询 并将结果保存为数据集中的表 我看到很多关于安排数据传输的信息in到 BigQuery 或 Cloud Storage 但我没有找到任何有关安排导出的信息from尚未将 BigQuery 表传输到 C
  • 无法让 Three.js EffectComposer 工作

    我想开始使用 EffectComposer 对渲染进行一些后处理 但我无法获得渲染到屏幕的最基本设置 它只是保持空白 我一定是在看什么东西 有人有想法吗
  • Linux:分叉两次和守护进程(ise)之间的区别

    我试图编写一个基本的多处理 tcp 服务器 它为每个新的 Accept 分叉一个进程 我不需要父进程等待子进程 我遇到了两种解决方案 分叉两次和守护进程 两者有什么区别 这种场景下哪个更合适呢 在其中选择之一时需要考虑哪些因素 有一个微妙的
  • 检查 ruby​​ on Rails 中是否启用了 javascript 和 cookies?

    我想检查 Ruby on Rails 中的页面加载时是否启用了 javascript 和 cookies 因此 如果有人尝试打开它 网站应该显示一条消息 表明他无法继续操作 你可以使用
  • 我可以在 godaddy 上部署 Spring Boot 应用程序吗

    我可以在 godaddy 上部署 Spring Boot 应用程序吗 使用虚拟主机和 cPanel 谢谢 不会 如果您正在使用网络托管 共享 计划根据戈迪详情 我建议的答案来自Amir Al 了解更多信息 网络托管 共享 通常会限制您可以使
  • 使用翻译功能删除 XSLT 中的单词“and”

    我想删除这个词 and 使用翻译函数而不是使用替换从字符串中获取 例如
  • 在 C# 中将 MM/DD/YYYY HH:MI:SS AM/PM 转换为 DD/MM/YYYY

    如何使用 C 将 MM DD YYYY HH MI SS AM PM 转换为 DD MM YYYY 我正在使用 C 2008 Thanks Use TryParseExact解析为DateTime then ToString带有要转换回来的
  • Redis 服务器重启/扩展后如何重新连接 Redis 客户端

    我有一个 azure 应用程序服务 基于 Docker 它使用 Redis 作为缓存 当我重新启动 扩展 Redis 服务器时 azure 应用程序服务内的 Redis 客户端与服务器失去连接并引发以下异常 等待响应超时 出站 0KiB 入
  • 如何更新sqlite中的整列? [复制]

    这个问题在这里已经有答案了 可能的重复 需要更新SQLite中某列的值 大家好 我的 Android 应用程序的 SQLite 数据库表中有 5 条记录 值为 5 25 15 25 25 现在我想用 50 更新我的整个列 例如 5 50 5
  • UrlEncodedFormEntity 的 Android HTTP 上传进度

    有几个问题讨论了如何使用 multipart form data 数据格式将进度指示添加到 Android 中的 HTTP 文件上传中 建议的典型方法是由最佳答案概括的无法获取 http POST 文件上传的进度 Android 包含完整
  • Django Rest 框架表单

    我想做的事 Django Rest Framework 附带一个渲染器 用于从序列化器返回 HTML 表单 1 在仔细阅读文档和代码之后 我仍然无法弄清楚如何让它呈现空白表单 我认为问题可能在于 我不知道如何实例化空白序列化器 在 DRF
  • yii 验证码无法正确验证

    我尝试使用 yii 添加验证码到我的联系表单 但验证存在一些问题 My model class ContactForm extends CFormModel public verifyCode public function rules r
  • iPhone 应用程序提交:错误 ITMS-90171:无效的捆绑结构 (constants.o)

    我做了大量的研究 并做了几件事来尝试消除这个错误 绝对没有任何作用 当我从 Xcode 中将存档上传到应用程序商店时 出现以下错误 错误 ITMS 90171 无效的捆绑包结构 不允许使用二进制文件 app constants o 除了受支
  • Ngb Tab 在选项卡更改时重新加载组件

    我有 2 个选项卡 选项卡内容内有一个我开发的组件 当我从一个选项卡移动到另一个选项卡并返回到放置我开发的组件的选项卡时 它会重新加载并调用其生命周期方法 这给我带来了问题 有没有办法在选项卡更改时停止重新加载组件 HTML 代码
  • asp.net mvc 和 recaptcha 操作 [重复]

    这个问题在这里已经有答案了 当用户提交表单时 我想间歇性地显示 重定向到验证码页面 基于一些自定义规则 如果经过验证 则执行 提交第一个操作 有没有办法使用 ActionFilter 来做到这一点 或者任何其他方式 这也是 http egl
  • 在ubuntu 16.04上安装pip

    我正在安装pip对于 python3 我为此使用了以下命令 sudo apt get install python3 pip 但安装后还是提示pip未安装 I have python 3 5 2安装 The python3 pip软件包为
  • TinyMCE 在隐藏文本区域之前不会从文本区域获取内容

    我在页面上运行了一个 TinyMCE 实例 使我能够编辑现有帖子 我查询数据库并填充变量 content与存储的文本 然后我有以下 HTML
  • 仅使用 xamarin Andriod 连接到 mySQL 数据库时出现问题,但可在 iOS 和 UWP 中使用

    我正在从 Xamarin 跨平台应用程序直接连接到 mySQL 服务器 仅用于学习目的 该连接在 iOS 和 UWP 中都运行良好 但在 Android 中会抛出此行错误 等待 conn OpenAsync 这是完整的错误 System T
  • LLVM JIT编译的程序找不到外部函数

    我的程序 JIT 编译 LLVM IR 模块并调用函数foo如果其中定义在运行时失败foo使用外部定义的函数 LLVM ERROR Program used external function glutInit which could no