【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!

原文地址:https://www.cnblogs.com/SoaringLee/p/10532286.html