1# libc标准库 2 3## 简介 4C标准函数库在C语言程序设计中,提供符合标准的头文件,以及常用的库函数实现(如I/O输入输出和字符串控制)。 5 6OpenHarmony采用musl作为C标准库,musl库是一个轻量,快速,简单,免费的开源libc库,详细介绍参考[musl官方参考手册](http://musl.libc.org/manual.html)。 7 8musl与glibc的差异点请参考[musl与glibc功能对比](https://wiki.musl-libc.org/functional-differences-from-glibc.html)。 9 10## 标准C库组件介绍 11 12[libc、libm、libdl](https://zh.cppreference.com/w/c/header)组合实现C11标准C库。 13 14libc:包含线程相关接口,以及大部分标准接口。 15 16libm:数学库函数接口,当前在OpenHarmony中是一个链接,实际都在libc中定义。 17 18libdl:dlopen等动态链接器接口,当前在OpenHarmony中是一个链接,实际都在libc中定义。 19 20## musl版本号 21 221.2.0 23 24从OpenHarmony4.0开始,版本升级到1.2.3 25 26从OpenHarmony5.0开始,版本升级到1.2.5 27 28## 支持的能力 29提供兼容C99,C11,POSIX标准的头文件,以及库函数接口,但不是完全兼容;支持armv7a,arm64, x86_64三种架构的支持; 30 31为了更好的适配OpenHarmony设备的高性能,低内存,高安全,轻量化,支持多种形态设备的基本特征;在musl开源库的基础上进行了优化,增强,对不适用嵌入式设备的接口进行了裁剪。 32 33### 新增能力 341. 动态加载器支持命名空间隔离能力,应用可以dlopen加载的动态库受系统命名空间限制(比如,无法打开系统侧动态库)。 352. 支持dlclose真实卸载动态库能力,musl的开源版本不支持。 363. 支持symbol-versioning功能。 374. dlopen支持直接加载zip包中未压缩的文件。 38 39### 调试能力 40libc提供了动态使能维测log功能(默认关闭),供开发者需要的时候查看libc库异常。使用libc提供的动态使能维测log功能,不需要重新编译libc库,只需设置param属性即可。在正式发布版本中,不建议使能,会影响运行性能。 41 42#### 1. musl.log功能 43设置musl.log.enable属性为true,打开musl维测log打印。打印其他日志,需先打开此开关。 44``` 45param set musl.log.enable true 46``` 47 48#### 2. 加载器log功能 49加载器是libc中负责程序引导,dlopen,dlclose等动态链接程序,如需要查看动态加载过程异常,可以打开加载器log。用法如下: 50* 使能全部应用的加载器log,log量比较大,请谨慎使用。 51``` 52param set musl.log.ld.app true 53``` 54* 使能指定应用的加载器log,{app_name}需要替换成真实需要打印log的应用名字。 55``` 56param set musl.log.ld.all false 57param set musl.log.ld.app.{app_name} true 58``` 59* 打印全部应用除指定名字应用外的加载器日志。 60``` 61param set musl.log.ld.all true 62param set musl.log.ld.app.{app_name} false 63``` 64## musl 差异规格接口说明 65 66| 接口名称 | 说明 | 67|:-- | :-- | 68| epoll_create | 在OpenHarmony5.0 上 该接口逻辑与1.2.3版本保持一致,不会对入参进行判断,不区分入参小于等于0的情况,预计下版本更新此接口逻辑与社区1.2.5保持一致,增加入参逻辑判断,入参小于等于0时创建失败,并返回错误码EINVAL。 | 69 70## ICONV支持的字符集编码格式 71 72musl支持的字符集编码格式,以及受支持的别名。 73> **注意** 74> 75> 在进行字符集编码格式转换时,请使用正确的源字符集编码格式,且目标字符集编码格式必须支持这些受转换的字符,否则转换失败。 76> 在musl里不支持将源字符集编码格式转换成这五种目标字符集编码格式:gb18030,gbk,gb2312,big5和euckr。 77 78| 编码格式 | 别名 | musl支持情况| 79|:-- | :-- | :--: | 80|utf8 | | 支持 | 81|wchart | | 支持 | 82|ucs2be | | 支持 | 83|ucs2le | | 支持 | 84|utf16be | | 支持 | 85|utf16le | | 支持 | 86|ucs4be |utf32be | 支持 | 87|ucs4le |utf32le | 支持 | 88|ascii |usascii, iso646, iso646us | 支持 | 89|utf16 | | 支持 | 90|ucs4 |utf32 | 支持 | 91|ucs2 | | 支持 | 92|eucjp | | 支持 | 93|shiftjis |sjis, cp932 | 支持 | 94|iso2022jp| | 支持 | 95|gb18030 | | 支持 | 96|gbk | | 支持 | 97|gb2312 | | 支持 | 98|big5 |bigfive, cp950, big5hkscs | 支持 | 99|euckr |ksc5601, ksx1001, cp949 | 支持 | 100|iso88591 |latin1 | 支持 | 101|iso88592 | | 支持 | 102|iso88593 | | 支持 | 103|iso88594 | | 支持 | 104|iso88595 | | 支持 | 105|iso88596 | | 支持 | 106|iso88597 | | 支持 | 107|iso88598 | | 支持 | 108|iso88599 | | 支持 | 109|iso885910| | 支持 | 110|iso885911|tis620 | 支持 | 111|iso885913| | 支持 | 112|iso885914| | 支持 | 113|iso885915|latin9 | 支持 | 114|iso885916| | 支持 | 115|cp1250 |windows1250 | 支持 | 116|cp1251 |windows1251 | 支持 | 117|cp1252 |windows1252 | 支持 | 118|cp1253 |windows1253 | 支持 | 119|cp1254 |windows1254 | 支持 | 120|cp1255 |windows1255 | 支持 | 121|cp1256 |windows1256 | 支持 | 122|cp1257 |windows1257 | 支持 | 123|cp1258 |windows1258 | 支持 | 124|koi8r | | 支持 | 125|koi8u | | 支持 | 126|cp437 | | 支持 | 127|cp850 | | 支持 | 128|cp866 | | 支持 | 129|cp1047 |ibm1047 | 支持 | 130 131## musl不支持接口列表。 132 133[native api中没有导出的符号列表](musl-peculiar-symbol.md) 134 135[NDK musl-libc接口受权限影响的说明](guidance-on-ndk-libc-interfaces-affected-by-permissions.md) 136 137 138<!--no_check--> 139