ld.lld的unknown file type错误

文章描述了在编译AndroidOpenSourceProject(AOSP)时遇到的关于libpdfium链接错误,特别是libpdfium-libopenjpeg2.a识别问题。作者通过检查文件类型并重新编译解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错

  在一次编译aosp源码中,出现以下错误:

FAILED: //external/pdfium:libpdfium link libpdfium.so [arm]
Outputs: out/soong/.intermediates/external/pdfium/libpdfium/android_arm_armv8-a_shared/unstripped/libpdfium.so
Error: exited with code: 1
Command: prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ out/soong/.intermediates/bionic/libc/crtbegin_so/android_arm_armv8-a/crtbegin_so.o @out/soong/.intermediates/external/pdfium/libpdfium/android_arm_armv8-a_shared/unstripped/libpdfium.so.rsp -Wl,--whole-archive  out/soong/.intermediates/external/pdfium/fpdfsdk/libpdfium-fpdfsdk/android_arm_armv8-a_static/libpdfium-fpdfsdk.a -Wl,--no-whole-archive  out/soong/.intermediates/external/pdfium/core/fpdfapi/edit/libpdfium-edit/android_arm_armv8-a_static/libpdfium-edit.a out/soong/.intermediates/external/pdfium/fpdfsdk/formfiller/libpdfium-formfiller/android_arm_armv8-a_static/libpdfium-formfiller.a out/soong/.intermediates/external/pdfium/core/fpdftext/libpdfium-fpdftext/android_arm_armv8-a_static/libpdfium-fpdftext.a out/soong/.intermediates/external/pdfium/fxjs/libpdfium-fxjs/android_arm_armv8-a_static/libpdfium-fxjs.a out/soong/.intermediates/external/pdfium/fpdfsdk/pwl/libpdfium-pwl/android_arm_armv8-a_static/libpdfium-pwl.a out/soong/.intermediates/external/pdfium/core/fpdfdoc/libpdfium-fpdfdoc/android_arm_armv8-a_static/libpdfium-fpdfdoc.a out/soong/.intermediates/external/pdfium/core/fpdfapi/render/libpdfium-render/android_arm_armv8-a_static/libpdfium-render.a out/soong/.intermediates/external/pdfium/core/fpdfapi/page/libpdfium-page/android_arm_armv8-a_static/libpdfium-page.a out/soong/.intermediates/external/pdfium/core/fpdfapi/font/libpdfium-font/android_arm_armv8-a_static/libpdfium-font.a out/soong/.intermediates/external/pdfium/core/fpdfapi/cmaps/libpdfium-cmaps/android_arm_armv8-a_static/libpdfium-cmaps.a out/soong/.intermediates/external/pdfium/core/fpdfapi/parser/libpdfium-parser/android_arm_armv8-a_static/libpdfium-parser.a out/soong/.intermediates/external/pdfium/core/fdrm/libpdfium-fdrm/android_arm_armv8-a_static/libpdfium-fdrm.a out/soong/.intermediates/external/pdfium/core/fxcodec/libpdfium-fxcodec/android_arm_armv8-a_static/libpdfium-fxcodec.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-libopenjpeg2/android_arm_armv8-a_static/libpdfium-libopenjpeg2.a out/soong/.intermediates/external/pdfium/core/fxge/libpdfium-fxge/android_arm_armv8-a_static/libpdfium-fxge.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-agg/android_arm_armv8-a_static/libpdfium-agg.a out/soong/.intermediates/external/pdfium/core/fxcrt/libpdfium-fxcrt/android_arm_armv8-a_static/libpdfium-fxcrt.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-skia_shared/android_arm_armv8-a_static/libpdfium-skia_shared.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-third_party-base/android_arm_armv8-a_static/libpdfium-third_party-base.a out/soong/.intermediates/external/pdfium/third_party/libpdfium-lcms2/android_arm_armv8-a_static/libpdfium-lcms2.a out/soong/.intermediates/external/libcxxabi/libc++demangle/android_arm_armv8-a_static/libc++demangle.a prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux/libclang_rt.builtins-arm-android.a out/soong/.intermediates/external/freetype/libft2/android_arm_armv8-a_shared/libft2.so out/soong/.intermediates/external/icu/libicu/libicu/android_arm_armv8-a_shared_current/libicu.so out/soong/.intermediates/external/libjpeg-turbo/libjpeg/android_arm_armv8-a_shared/libjpeg.so out/soong/.intermediates/external/zlib/libz/android_arm_armv8-a_shared/libz.so out/soong/.intermediates/external/libcxx/libc++/android_arm_armv8-a_shared/libc++.so out/soong/.intermediates/bionic/libc/libc/android_arm_armv8-a_shared_current/libc.so out/soong/.intermediates/bionic/libm/libm/android_arm_armv8-a_shared_current/libm.so out/soong/.intermediates/bionic/libdl/libdl/android_arm_armv8-a_shared_current/libdl.so out/soong/.intermediates/bionic/libc/crtend_so/android_arm_armv8-a/obj/bionic/libc/arch-common/bionic/crtend_so.o -o out/soong/.intermediates/external/pdfium/libpdfium/android_arm_armv8-a_shared/unstripped/libpdfium.so -target armv7a-linux-androideabi10000 -Bprebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/arm-linux-androideabi/bin -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe -fuse-ld=lld -Wl,--pack-dyn-relocs=android+relr -Wl,--no-undefined -Wl,--hash-style=gnu -Wl,-m,armelf -Wl,--exclude-libs=libclang_rt.builtins-arm-android.a  -nostdlib -Wl,--gc-sections -shared -Wl,-soname,libpdfium.so -Wl,-icf=all 
Output:
ld.lld: error: out/soong/.intermediates/external/pdfium/third_party/libpdfium-libopenjpeg2/android_arm_armv8-a_static/libpdfium-libopenjpeg2.a: unknown file type
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)

  报错提示libpdfium-libopenjpeg2.a无法被ld.lld识别,被标记为unknown file type。

解决方法

  先用file命令查看libpdfium-libopenjpeg2.a的文件属性。正常的静态库文件会作以下提示,表明这是一个正确的静态库:

libpdfium-libopenjpeg2.a:current ar archive

  但是这里确提示"empty",表明这是一个空文件。

  于是,我删掉out/soong/.intermediates/external/pdfium下面的所有文件,重新正确编译生成libpdfium-libopenjpeg2.a后,此错误被修复。

在Linux实验三中,你需要使用C语言结合标准库中的`stat`、`access`和`chmod`等函数来完成对文件的分析和权限更改。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> // 判断文件类型 enumFileType { FILE_TYPE_UNKNOWN, FILE_TYPE_REGULAR, FILE_TYPE_DIR, FILE_TYPE_SYMLINK, }; enumFileType getFileType(const char* filename) { struct stat stbuf; int ret = stat(filename, &stbuf); if (ret != 0) { perror("Stat failed"); return FILE_TYPE_UNKNOWN; } switch (stbuf.st_mode & S_IFMT) { case S_IFREG: return FILE_TYPE_REGULAR; case S_IFDIR: return FILE_TYPE_DIR; case S_IFLNK: return FILE_TYPE_SYMLINK; default: return FILE_TYPE_UNKNOWN; } } // 获取文件权限信息 void printPermissions(const char* filename) { struct stat stbuf; int ret = stat(filename, &stbuf); if (ret != 0) { perror("Stat failed"); return; } printf("File Type: %s\n", getFileType(filename) == FILE_TYPE_REGULAR ? "Regular File" : getFileType(filename) == FILE_TYPE_DIR ? "Directory" : "Symbolic Link"); printf("Inode Node ID: %ld\n", stbuf.st_ino); printf("Links: %lu\n", stbuf.st_nlink); printf("User ID: %d\n", stbuf.st_uid); printf("Group ID: %d\n", stbuf.st_gid); printf("Size: %lld bytes\n", stbuf.st_size); } // 修改文件权限 void changePermissions(const char* filename) { mode_t new_mask = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP; // 允许当前用户和组内的用户读写 if (chmod(filename, new_mask) != 0) { perror("Failed to change permissions"); } else { printf("Permissions changed successfully.\n"); } } int main() { char filename[100]; printf("Enter file name: "); fgets(filename, sizeof(filename), stdin); filename[strcspn(filename, "\n")] = '\0'; printPermissions(filename); changePermissions(filename); return 0; } ``` 这个程序会提示用户输入文件名,然后获取并打印文件类型、inode信息、链接数、用户ID、组ID和文件大小。接着,它会尝试将文件权限改为允许当前用户及组内的用户读写。 请注意,实际运行时可能需要处理异常情况,比如文件不存在、路径错误等。此外,对于敏感操作,如修改权限,需要谨慎处理,确保程序安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Invoker123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值