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!

  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532286.html
Copyright © 2011-2022 走看看