zoukankan      html  css  js  c++  java
  • 【link】IOS平台下汇编函数符号链接问题

    DATE: 2018.11.12


    1、参考

    https://blog.csdn.net/u012351051/article/details/81150203
    https://blog.csdn.net/roland_sun/article/details/50452646

    2、问题描述

        ARM32汇编代码在arm平台下编译链接都没问题的,但是迁移到IOS32平台(MAC电脑上编译)出现了汇编文件中的函数符号未定义的问题(无法链接的外部符号)。

    3、分析和解决方案

    分析: 通过对库文件中的函数符号nm分析发现,C文件编译后的函数符号前面都是带有一个下划线“_”的,但是汇编文件的函数符号前面都不带下划线的,因此导致链接时找不到(C调汇编)。
    并且进一步分析发现:
    在Linux平台和ARM平台下,C文件和汇编文件编译后的函数符号都不带下划线。由此可见,不同编译器(gcc,cross-gcc以及clang)对编译后的函数符号的处理是不同的。
    解决方案:
    在IOS平台下,汇编文件编译后的函数符号前面加上下划线。如下所示:
    或者可以直接采用ffmpeg中的asm.S头文件。

    #include "asm.S"
    
    #if ARCH_IOS
    #define EXTERN_ASM _
    #else
    #define EXTERN_ASM 
    #endif
    
    4、补充知识

    C语言中在函数名或关键字前加下划线:
    一般情况是标识该函数或关键字是自己内部使用的,与提供给外部的接口函数或关键字加以区分。

    UNIX下的C语言就规定,C语言的源代码文件中的所有全局变量和函数经过编译后,相应的符号名前面会自动的加上下划线“_”。这样做的好处,就是方便是程序开发人员,不用太小心翼翼的起名,避免了与汇编文件中的符号名的冲突。
    查看动态库或目标文件是否是PIC的方法:

    nm libxxx | grep "TEXTREL"
    

    如果上述命令运行后没有任何打印,则说明是PIC的。


    THE END!

  • 相关阅读:
    kafka环境搭建
    zookeeper环境搭建学习
    linux时间不准
    (转)Mac osx 下安装iTerm2,并使用rz sz上传下载(附homebrew配置)
    安装mariadb数据库
    mydumper 安装使用
    granfa 安装,配置prometheus数据源
    prometheus 普罗米修斯安装
    Docker常用命令
    winform 一个点击事件触发另一个点击事件
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532286.html
Copyright © 2011-2022 走看看