Openharmony编译报错:ld.lld: error: undefined symbol: fcntl64
openharmony编译报错问题分析记录待解决:ld.lld: error: undefined symbol: fcntl64
问题描述:
工作中打算按照https://isrc.iscas.ac.cn/gitlab/riscv/polyosmobile/documents/-/blob/master/milestone/qemu_launcher.md
文章的方法在ubuntu18.04虚拟机中用qemu把riscv64跑起来。
编译qemu那个步骤中报错“ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29‘”。
参考https://blog.csdn.net/m0_37201243/article/details/123641552
中的方法,将libc升级到2.29,问题解决。
然后下载完ohos-qemu用./build.sh --product-name qemu_riscv64_virt_linux_system --ccache命令进行构建时报错:
[OHOS ERROR] [28716/34549] LINK clang_x64/developtools/global_restool/restool
[OHOS ERROR] FAILED: clang_x64/developtools/global_restool/restool clang_x64/exe.unstripped/clang_x64/developtools/global_restool/restool
[OHOS ERROR] /usr/bin/env "../../build/toolchain/gcc_link_wrapper.py" --output="clang_x64/developtools/global_restool/restool" --strip="../../prebuilts/clang/ohos/linux-x86_64/llvm-riscv/bin/llvm-strip" --unstripped-file="clang_x64/exe.unstripped/clang_x64/developtools/global_restool/restool" -- ../../prebuilts/clang/ohos/linux-x86_64/llvm-riscv/bin/clang++ -Wl,--fatal-warnings -Wl,--build-id=md5 -fPIC -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro -Wl,-z,defs -Wl,--as-needed -fuse-ld=lld -Wl,--icf=all -Wl,--color-diagnostics -m64 -Werror -Wl,-O2 -Wl,--gc-sections -rdynamic -Wl,-rpath-link=clang_x64 -Wl,--disable-new-dtags -Wl,-rpath=\$ORIGIN/. -Wl,-rpath-link=. -pie -o "clang_x64/exe.unstripped/clang_x64/developtools/global_restool/restool" -Wl,--start-group @"clang_x64/developtools/global_restool/restool.rsp" -latomic -ldl -lpthread -lrt -Wl,--end-group
[OHOS ERROR] ld.lld: error: undefined symbol: fcntl64
[OHOS ERROR] >>> referenced by nanohttp.c
[OHOS ERROR] >>> nanohttp.o:(xmlNanoHTTPConnectAttempt) in archive clang_x64/obj/developtools/global_resource_tool/build/libxml2/librestool_libxml2.a
[OHOS ERROR] >>> referenced by nanohttp.c
[OHOS ERROR] >>> nanohttp.o:(xmlNanoHTTPConnectAttempt) in archive clang_x64/obj/developtools/global_resource_tool/build/libxml2/librestool_libxml2.a
[OHOS ERROR] >>> referenced by sqlite3.c
[OHOS ERROR] >>> sqlite3.o:(aSyscall) in archive clang_x64/obj/developtools/global_resource_tool/build/sqlite3/librestool_sqlite.a
[OHOS ERROR] clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
问题思考:
思路一:回退GCC到2.27。再次按之前升级GCC 的方法make gcc-2.27。但在make执行过程中,打印陷入死循环。放弃。
思路二:由于编译报错,打算不对相应的libxml2模块进行编译,修改/home/admin/OpenHarmony/ohos_qemu_riscv64/third_party/libxml2/build.gn文件。再次./build.sh,发现libxml2种的接口被很多其他地方依赖,再次报错,放弃。
思路三:解决ld.lld: error: undefined symbol: fcntl64符号链接问题。
思路四:自行实现fcntl接口,还会有其他很多地方报同样的错误(网上搜了半天没有找到接口实现,感觉需要去找libc的源码)。
思路五:修改libxml库代码,还会有其他很多地方报同样的错误。
#ifdef _WINSOCKAPI_
{
u_long one = 1;
status = ioctlsocket(s, FIONBIO, &one) == SOCKET_ERROR ? -1 : 0;
}
#else /* _WINSOCKAPI_ */
#if defined(VMS)
{
int enable = 1;
status = ioctl(s, FIONBIO, &enable);
}
#else /* VMS */
#if defined(__BEOS__) && !defined(__HAIKU__)
{
bool noblock = true;
status =
setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &noblock,
sizeof(noblock));
}
#else /* __BEOS__ */
if ((status = fcntl(s, F_GETFL, 0)) != -1) {
#ifdef O_NONBLOCK
status |= O_NONBLOCK;
#else /* O_NONBLOCK */
#ifdef F_NDELAY
status |= F_NDELAY;
#endif /* F_NDELAY */
#endif /* !O_NONBLOCK */
status = fcntl(s, F_SETFL, status);
}
if (status < 0) {
#ifdef DEBUG_HTTP
perror("nonblocking");
#endif
__xmlIOErr(XML_FROM_HTTP, 0, "error setting non-blocking IO\n");
closesocket(s);
return INVALID_SOCKET;
}
#endif /* !__BEOS__ */
#endif /* !VMS */
#endif /* !_WINSOCKAPI_ */
问题解决:
真正解决后续写。。
从别人那里拷了了一个虚拟机,安装qemu和编译ohos_qemu_riscv64都没有问题。查看libm的版本是2.3.1,可以尝试把libc升级到 2.3.1版本。
更多推荐



所有评论(0)