如何更改 c++ 文件的 mach-o 可执行文件的入口点?

2024-03-05

我正在尝试编写一个没有 main 的 C++ 程序。是否可以将 mach-o 可执行文件的入口点更改为自定义函数(除了main())?

如果没有的话,可以包起来吗main在实际的 C 之前调用我的 main 版本main叫做?

Edit:

我想要我的自定义函数调用 Cmain。如果我给它一个构造函数属性或将其添加到构造函数列表中,那么main将被调用两次。我不希望这种情况发生。

P.S 我正在 Mac OS X High Sierra 中使用 clang 版本 9.1.0 构建可执行文件


您可以使用-e <symbol>ld 的选项,您可以将其调用为-Wl,-e,_<symbol>从叮叮当当。从历史上看,程序的入口点是_start来自 crt0.o,但是自 Mac OS X 10.8 和 iOS 6.0 以来,Darwin 上就不再有这种情况了,其中LC_MAIN引入了加载命令(替换LC_UNIXTHREAD)。仍然可以使用“旧”方式,但必须使用-no_new_main链接器标志(有一个对应的-new_main,如果您需要它)。曾经由 crt0.o 承担的职责已转移到动态链接器,/usr/lib/dyld,它可以同时处理LC_MAIN and LC_UNIXTHREAD如所须。

所以给定一个 C 程序main:

// t.c
#include <stdio.h>

int main(int argc, const char **argv)
{
    printf("test %i\n", argc);
    return 0;
}

您可以轻松创建一个 C++ 文件,如下所示:

// t.cpp

extern int main(int, const char**);

extern "C" int derp(int argc, const char **argv)
{
    return main(0, (const char*[]){ (const char*)0 });
}

并编译它们clang++ -o t t.cpp -xc t.c -Wl,-e,_derp.
请务必声明derp as extern "C",或在命令行上指定损坏的符号。

您还可以使用以下命令检查生成的可执行文件otool确保它使用LC_MAIN而不是LC_UNIXTHREAD:

bash$ otool -l ./t | fgrep -B1 -A3 LC_MAIN
Load command 11
       cmd LC_MAIN
   cmdsize 24
  entryoff 3808
 stacksize 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 c++ 文件的 mach-o 可执行文件的入口点? 的相关文章

随机推荐

  • 使用 Ruby 读取文件的上一行

    如何读取文件的前一行 与 IO gets 相反 我最初想将 IO lineno 设置为我想要读取的行号 但这并没有按预期工作 您实际上如何阅读前一行 一个简单的方法是记住您读过的上一行 prev nil File foreach vimrc
  • 如何获取未知 JSON 层次结构的总深度?

    我一直在努力寻找 构建一个递归函数来解析这个 JSON 文件并获取其子文件的总深度 该文件看起来像这样 var input name positive children name product service children name
  • 从点云到 Mat 的转换

    假设我初始化了一个点云 我想将其 RGB 通道存储在 opencv 的 Mat 数据类型中 我怎样才能做到这一点 pcl PointCloud
  • Chartjs 示例无法重现

    我希望从 Chartjs 文档中重现此示例的结果 https www chartjs org docs latest samples scales time line html https www chartjs org docs late
  • R 3.0.x 中的 RExcel

    兰德之友 http rcom univie ac at download html RAndFriends 其中包括运行所需的所有项目RExcel 仅包括R 2 15 2 我目前使用的是最新版本R but rcom 2 3 1 and rs
  • Android StaggeredGridLayoutManager 偏移错误

    当你清除你的adapter并打电话notifyDataSetChanged 交错网格布局管理器经理还有mCachedStart End in Span 实例 因此 当您向适配器添加新项目时 布局管理器会使用以下命令绘制项目offset 这是
  • 修改可变对象的方法?

    鉴于函数式编程在尽可能坚持不可变变量时是最好的 并且 Ramda 总是进行浅拷贝 那么对象如何must在大多数纯功能框架中处理可变的问题 例如 考虑 PIXI Sprite 在 pixi js 中 显示系统具有链接在一起的固有层次结构 并且
  • 在堆积条形图中添加组之间的间距

    假设我有一个带有分组条形的条形图 酒吧有一个大团体和多个非常小的团体 组标签位于组上 为了增加可读性 我想在组之间引入一定的间距 我使用以下代码和图像编辑器创建了一个示例图像 library ggplot2 g lt ggplot mpg
  • 指示函数使用“参数”对象的最清晰方法是什么?

    指示函数使用 参数 对象的最佳方式是什么 这显然是基于意见的 但是有任何约定吗 什么时候使用参数数组更好 一些例子 Function takes n arguments and makes them pretty function many
  • 如何将 JWT 令牌存储在仅 HTTP 的 cookie 中?

    我创建了一个应用程序 它仅使用服务器根据正确的登录凭据发送的 JWT 并对任何内容进行授权 api我的后端 Express js 服务器上的路由 另一方面 AngularJS 获取此令牌 将其存储在会话存储中 并每次都使用身份验证拦截器将令
  • 组件未显示在 Vue DevTools 中

    有人遇到过这个问题吗 我正在使用 Vue Devtools 但无法检查任何组件 因为没有显示任何组件 没有根组件或任何东西 几乎只是一个空白的开发工具 我是 Vue 新手 所以我确信我错过了一些明显的东西 我正在使用 webpack cli
  • Nestjs Config 访问引导级别的配置

    根据这个文档 https www npmjs com package nestjs config您在 AppModule 中导入您的配置 我正在尝试访问 main ts 文件中引导级别的配置 像这样的事情 const app await N
  • 可以从桌面应用程序调用 EJB 吗?

    我是 Java EJB 3 0 的新手 是否可以从桌面应用程序客户端调用部署在 JBoss 上的 会话 bean 提前致谢 是的你可以 这里有一些细节 参考 EJB2 但当涉及到远程客户端时 EJB3 也是如此 http www these
  • 将 Bing 地图引用添加到 Windows Phone 8.1 项目

    我想在 Windows Phone 8 1 C 项目中添加对 Bing 地图的引用 我已经安装了这个包http visualstudiogallery msdn microsoft com 224eb93a ebc4 46ba 9be7 9
  • 如何在 WP8 上打开 Facebook 应用程序以共享链接?

    我想知道如何打开官方 Facebook 应用程序以从 Windows Phone 上的 C 代码共享 URI 常见的 Uri Scheme 如下 fb 可以打开应用程序 但似乎没有参数起作用 我有这样的想法 但它对我不起作用 LaunchU
  • 如何引用类中最终静态字段的值?

    使用 JavaDoc 如何引用类中最终静态字段的值 我想要 在此示例中替换为字段的值STATIC FIELD This is a simple class with only one static field with the value
  • 我的安装程序如何有选择地删除一些最初并非创建的文件?

    我将所有程序的设置存储在 appdata 目录 appdata MyProgram 中 当出现问题而用户必须重新安装时 我想询问是否删除该目录中的数据 我正在使用 Inno Setup 并添加了一个自定义页面来提示用户 if DirExis
  • 从勤杂工到请求帖子的管道流

    I have multipart form data我要发布到快速端点 data upload 形成以下标记 form enctype multipart form data action data upload method post i
  • 如何在 WPF 中的多显示器显示上定位窗口?

    我正在尝试将一个窗口放置在辅助显示屏的右上角 在 Window Loaded 事件处理程序中 我有以下代码 private void Window Loaded object sender RoutedEventArgs e this Le
  • 如何更改 c++ 文件的 mach-o 可执行文件的入口点?

    我正在尝试编写一个没有 main 的 C 程序 是否可以将 mach o 可执行文件的入口点更改为自定义函数 除了main 如果没有的话 可以包起来吗main在实际的 C 之前调用我的 main 版本main叫做 Edit 我想要我的自定义