libc.a中FILE结构的分析

本文详细解析了标准输入输出头文件stdio.h中FILE结构的定义,并介绍了与之相关的宏定义及函数指针的使用方法。

stdio.h中有FILE结构的定义
typedef char __stdiobuf_t; /* stdio buffer type */
typedef STDIO_USIZE_T __stdiosize_t; /* unsigned size_t */

typedef struct __iobuf {
__stdiobuf_t __rptr; / pointer into read buffer */
__stdiobuf_t __rend; / point at end of read buffer */
__stdiobuf_t __wptr; / pointer into write buffer */
__stdiobuf_t __wend; / point at end of write buffer */
__stdiobuf_t __base; / base of buffer */
__stdiosize_t __bufsiz; /* size of buffer */
short __flag; /* flags */
char __file; /* channel number */
__stdiobuf_t __buf; /* small buffer */
int (__filbuf) _STDIO_P_((struct __iobuf )); /* fill input buffer */
int (__flsbuf) _STDIO_P_((int, struct __iobuf )); /* flush output buffer */
int (__flush) _STDIO_P_((struct __iobuf )); /* flush buffer */
struct __iobuf __next; / next in chain */
} FILE;

stdiolib.h中有宏定义

define SETFILBUF(f,p) ( (f)->__filbuf = (p) )

define TESTFLAG(f,x) (((f)->__flag & (x)) != 0)

fseek.c中有对filbuf函数指针的赋值
SETFILBUF(fp, __brdupdate);

/opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --sysroot=/opt/android-ndk-r18b/platforms/android-21/arch-arm64 -I/home/chang/dev/mpp/mpp_build/install/usr/local/include -fPIC -c -o /tmp/ffconf.VYhSixhJ/test.o /tmp/ffconf.VYhSixhJ/test.c /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -L/home/chang/dev/mpp/mpp_build/install/usr/local/lib -lmpp --sysroot=/opt/android-ndk-r18b/platforms/android-21/arch-arm64 -o /tmp/ffconf.VYhSixhJ/test /tmp/ffconf.VYhSixhJ/test.o /..//bin/ld: cannot find crt1.o: No such file or directory /..//bin/ld: cannot find crti.o: No such file or directory /..//bin/ld: cannot find crtbegin.o: No such file or directory /..//bin/ld: cannot find -lmpp /..//bin/ld: cannot find -lgcc /..//bin/ld: cannot find -lgcc_s /..//bin/ld: skipping incompatible /opt/android-ndk-r18b/platforms/android-21/arch-arm64/usr/lib/libc.so when searching for -lc /..//bin/ld: skipping incompatible /opt/android-ndk-r18b/platforms/android-21/arch-arm64/usr/lib/libc.a when searching for -lc /..//bin/ld: skipping incompatible /opt/android-ndk-r18b/platforms/android-21/arch-arm64/usr/lib/libc.so when searching for -lc /..//bin/ld: skipping incompatible /opt/android-ndk-r18b/platforms/android-21/arch-arm64/usr/lib/libc.a when searching for -lc /..//bin/ld: cannot find -lc /..//bin/ld: cannot find -lgcc /..//bin/ld: cannot find -lgcc_s /..//bin/ld: cannot find crtend.o: No such file or directory /..//bin/ld: cannot find crtn.o: No such file or directory clang: error: linker command failed with exit code 1 (use -v to see invocation) C compiler test failed.好像更多错误了
最新发布
03-14
<think>嗯,用户遇到了一个Android NDK编译链接的错误,我得仔细看看。首先,他提供的命令是使用NDK r18b的clang编译一个测试程序,但链接时出现了一大堆找不到文件的错误。 首先看错误信息,找不到crt1.o、crti.o这些启动文件,这些通常是C运行时初始化的一部分。可能的问题出在sysroot的路径是否正确。用户指定的sysroot是/opt/android-ndk-r18b/platforms/android-21/arch-arm64,而NDK的目录结构可能在这些版本中有所变化。记得从NDK r19之后,工具链的结构变了,但用户用的是r18b,可能还是旧的结构。不过,可能sysroot的路径需要指向更标准的目录,比如在NDK中,应该检查是否存在对应架构的crt文件。 然后是找不到-lmpp,这说明链接器无法在指定的库路径中找到这个库。用户通过-L参数指定了mpp的安装路径,但可能路径不正确,或者库文件没有正确安装。需要确认/home/chang/dev/mpp/mpp_build/install/usr/local/lib下是否有libmpp.so或libmpp.a文件。 接下来还有关于libc、libgcc等的错误,这可能和sysroot配置有关。比如,链接器在sysroot指定的路径下找不到对应的库,或者架构不兼容。错误中提到skipping incompatible libc.so,可能是指架构不匹配,比如在arm64环境下使用了x86的库,但用户的arch-arm64应该没问题,可能路径不对。 另外,用户可能没有正确指定工具链的--gcc-toolchain参数,或者缺少必要的系统库路径。在较旧的NDK版本中,可能需要同时指定sysroot和其他库路径,或者使用正确的triple前缀。 可能的解决方案包括检查sysroot路径是否存在,确认库路径是否正确,检查mpp库是否编译正确,以及确认NDK版本和架构是否匹配。可能需要添加额外的链接参数,如指定gcc工具链路径,或者调整sysroot到NDK中的正确位置,例如使用ndk-bundle下的sysroot,或者检查是否有缺失的crt文件。</think>这个错误信息显示Android NDK在编译和链接过程中遇到多个路径和库文件缺失问题。我们逐步分析并解决: 一、路径配置分析 1. NDK工具链路径: ```bash /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ``` 确认该路径下clang可执行文件是否存在: ```bash ls -l /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ``` 2. sysroot路径验证: ```bash --sysroot=/opt/android-ndk-r18b/platforms/android-21/arch-arm64 ``` 检查关键启动文件是否存在: ```bash find /opt/android-ndk-r18b/platforms/android-21/arch-arm64 -name "crt*.o" ``` 二、关键错误解决方案 1. 找不到C运行时对象文件: ```bash crt1.o/crti.o/crtbegin.o missing ``` 添加`-gcc-toolchain`参数指定完整工具链路径: ```bash --gcc-toolchain=/opt/android-ndk-r18b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64 ``` 2. 链接库缺失问题: ```bash cannot find -lmpp ``` 验证mpp库路径正确性: ```bash ls -l /home/chang/dev/mpp/mpp_build/install/usr/local/lib/libmpp.* ``` 3. 系统库兼容性问题: ```bash skipping incompatible libc.so ``` 添加架构前缀参数: ```bash -target aarch64-linux-android21 ``` 三、完整修复命令示例 ```bash export NDK=/opt/android-ndk-r18b export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 export SYSROOT=$NDK/platforms/android-21/arch-arm64 $TOOLCHAIN/bin/clang \ --target=aarch64-linux-android21 \ --sysroot=$SYSROOT \ -gcc-toolchain $NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64 \ -I/home/chang/dev/mpp/mpp_build/install/usr/local/include \ -L/home/chang/dev/mpp/mpp_build/install/usr/local/lib \ -fPIC -pie -llog -lmpp -lc -o test test.c ``` 四、验证步骤 1. 检查NDK版本兼容性: ```bash file $TOOLCHAIN/bin/clang ``` 2. 确认交叉编译架构匹配: ```bash aarch64-linux-android-readelf -h test.o | grep Machine ``` 3. 检查动态库依赖: ```bash aarch64-linux-android-objdump -p test | grep NEEDED ``` 建议更新到较新NDK版本(如r25),旧版本r18b已于2018年发布,可能存在已知路径兼容性问题。若问题持续,建议使用ndk-build或CMake进行项目管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值