如何在 Mac OS X 上构建包含入口点的 C 程序?

2023-12-03

如何在 Mac OS X 上构建包含入口点的 C 程序?

我想建立:

start() {
    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

但是当我跑步时:

gcc -nostdlib min.c

我总是得到:

ld: could not find entry point "start" (perhaps missing crt1.o)
collect2: ld returned 1 exit status

我为了看看它在做什么而进行的另一次尝试是运行:

gcc -nostdlib -c min.c && otool -tV min.o

输出是:

(__TEXT,__text) section
_start:
0000000000000000    pushq   %rbp
0000000000000001    movq    %rsp,%rbp
0000000000000004    leave
0000000000000005    ret

那么“start”函数之前的下划线是从哪里来的呢?我该如何防止这种情况发生?或者更简单地说:

如何在 Mac OS X 上构建包含入口点的 C 程序?

谢谢, 疯狂陈兹


您可以通过单独声明来控制 gcc 赋予函数的符号asm:

void start() asm ("start");

确保这是一个独立的声明,与函数定义分开。

您可以在此处阅读有关控制生成符号的更多详细信息:https://stackoverflow.com/a/1035937/12928775

另外,正如 Peter Cordes 指出的那样,您可能应该包括__attribute__((naked))在函数定义上,以防止 gcc 在入口处生成堆栈帧。

完整的代码是:

void start() asm ("start");

__attribute__((naked)) void start() {
    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Mac OS X 上构建包含入口点的 C 程序? 的相关文章

随机推荐

  • EF Core 3.1 引发 Contains 异常

    我最近将项目代码更新为 NET Core 3 1 和 EF Core 3 1 现在我的大部分 linq 查询都停止了 EX public override ICollection
  • 如何在 C++ 中将 Pascal TDateTime(double) 时间转换为 Unix 纪元

    我需要使用 C 将双精度值 Pascal TDateTime 对象转换为 Unix 纪元 提出了一个可能的解决方案 unsigned int UnixStartDate 25569 unsigned int DateTimeToUnix d
  • 未定义不是一个函数,Google Geolocation

    我正在尝试在我的页面内的谷歌地图元素上显示地址作为标记
  • 避免从多线程 C# MVVM 应用程序中的 ViewModel 对象调用 BeginInvoke()

    我的 C 应用程序有一个数据提供程序组件 该组件在自己的线程中异步更新 ViewModel 类全部继承自实现了INotifyPropertyChanged 为了让异步数据提供程序使用 PropertyChanged 事件更新视图中的属性 我
  • 用鼠标旋转QGraphicsPixmapItem

    我正在 PyQt 中编写一个应用程序 允许用户选择 图像放置在QGraphicsScene 使用自定义QGraphicsPixmapItem 选择后我想要一个旋转手柄 出现在用户可以用鼠标 抓取 的图像上 旋转 从而旋转QGraphicsP
  • Java中定时调用方法

    如何在特定时间调用方法 例如在6 00和13 00调用该方法 我正在开发 Windows 桌面应用程序 看看Timer and TimerTask类 您可以安排线程在特定时间或重复执行 public class Alarm Timer ti
  • 从 php 中的 mysqli 连接查询访问行

    我有以下代码 db connection info set up earlier sql SELECT TABLE 1 ID TABLE 2 ID POTATO FROM TABLE 1 ID LEFT JOIN TABLE 2 ON TA
  • 在 R 中分割数值向量

    如果我有一个向量 c 1 2 3 5 7 9 10 12 和另一个向量 c 3 7 10 我将如何产生以下结果 1 1 2 3 2 5 7 3 9 10 4 12 请注意 3 7 和 10 如何成为每个列表元素的最后一个数字 最后一个除外
  • 有没有办法让 SQL Server 验证存储过程中的对象引用?

    以下代码在 SQL Server 中执行良好 create proc IamBrokenAndDontKnowIt as select from tablewhichdoesnotexist 当然 如果我尝试运行它 它会失败 对象名称 ta
  • 如何将枚举值序列化为 int?

    我想将我的枚举值序列化为 int 但我只得到名称 这是我的 示例 类和枚举 public class Request public RequestType request public enum RequestType Booking 1
  • Skip_blank_lines 不适用于 pandas

    test scores pd DataFrame id 1 2 4 5 first name Sachin Dravid Virat Yuvraj scores 150 210 125 75 state Mumbai Karnataka D
  • ES8 立即调用异步函数表达式

    我还没有看到这些构造被大量使用 但我发现自己编写它们是为了在通常不会返回承诺的函数中使用 async wait 例如 chan consume queue msg gt this pendingMsgs executed immediate
  • 如何检测设备是否有5Ghz Wi-Fi

    我花了很多时间寻找解决方案但没有结果 所以我的问题是 有什么方法可以检测设备是否有 5Ghz Wifi 吗 如果能够实现这一点那就太好了 我已经分析过了WifiManager但没有找到合适的方法或属性 提前致谢 从 Android API
  • 网络图中的搜索框

    我使用以下方法创建了一个蛋白质突变网络forceNetwork 的功能networkD3包裹 它在 RStudio 的 查看器 窗格上呈现 然后我可以将其保存为 HTML 文件以供共享 同时保留动态特性 如单击节点 突出显示连接等 A pn
  • 从 Java 运行 Ant 时设置 JAVA_HOME

    原因又长又无聊 但我需要运行 Ant 脚本来从 Java 1 4 应用程序编译 Java 1 5 代码 不过 我不断收到此错误 BUILD FAILED build xml 16 Unable to find a javac compile
  • 添加文本到图像

    HI 我目前正在开发一个应用程序 我必须在图像中的任何位置 不是子视图 在图像上添加文本 并且输出应该是带有原始图像和嵌入其中的文本的单个图像文件 任何帮助都将是可观的 例如 图像上的水印 谢谢 西瓦桑卡尔 UIImage myImage
  • VS 2008 调试器:它如何决定在哪个 Cassini 端口上运行 Web 服务?

    我有一个 VS 2008 解决方案 其中包括一个网站和一个 Web 服务 我同时开发两者 能够从一个调试到另一个是很有帮助的 它有时无法找到网络服务 如果我查看 web config 我发现它正在查看的端口号不是我使用调试器时自动运行服务的
  • 展平具有父子关系的数组,以便所有子项都位于父级

    早上好 给出以下数据结构 为了便于阅读 采用 JSON 格式 parent root active 1 label Index route children parent active 1 label Products route prod
  • 如何使用Python和Flask获取请求变量的值[重复]

    这个问题在这里已经有答案了 我想知道如何使用 Python 和 Flask 来获取 POST GET 请求变量的值 对于 Ruby 我会做这样的事情 variable name params FormFieldValue 我该如何用 Fla
  • 如何在 Mac OS X 上构建包含入口点的 C 程序?

    如何在 Mac OS X 上构建包含入口点的 C 程序 我想建立 start exit system call asm movl 1 eax xorl ebx ebx int 0x80 但是当我跑步时 gcc nostdlib min c