当我在我的Ubuntu Lucid 10.04 PC上编译某些内容时,它会与glibc链接.Lucid使用了2.11的glibc.当我在另一台带有旧glibc的PC上运行这个二进制文件时,命令失败说没有glibc 2.11 ......
据我所知,glibc使用符号版本控制.我可以强制gcc链接特定的符号版本吗?
在我的具体用法中,我尝试为ARM编译gcc交叉工具链.
我相信其他Fedora 28用户会知道,操作系统的glibc最近更新为glibc 2.27.在许多其他事情中,2.27增加了logf()和powf()的新实现.这导致我的应用程序无法在具有旧glibc(例如Debian)的发行版上运行.在Debian上调用应用程序时,会产生以下错误:
GLIBC-2.27(./app_name要求)我使用以下过程跟踪符号到logf和powf:
objdump -T ./app_name | grep GLIBC_2.27
Run Code Online (Sandbox Code Playgroud)
其中给出了以下输出:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 powf
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 logf
Run Code Online (Sandbox Code Playgroud)
然后...
objdump -T /lib/libm.so.6 | grep -w logf
objdump -T /lib/libm.so.6 | grep -w powf
Run Code Online (Sandbox Code Playgroud)
其中给出了以下输出:
000397a0 g DF .text 00000135 GLIBC_2.27 logf
00010430 g DF .text 0000009e (GLIBC_2.0) logf
Run Code Online (Sandbox Code Playgroud)
和...
000397a0 g DF .text 00000135 GLIBC_2.27 powf
00010430 g DF .text 0000009e (GLIBC_2.0) powf
Run Code Online (Sandbox Code Playgroud)
因此,有了powf()和logf()也在GLIBC-2.0中实现的信息,我将以下内容添加到我的项目中(在main()之上)并重新编译.
__asm__(".symver logf,logf@GLIBC_2.0");
__asm__(".symver powf,powf@GLIBC_2.0");
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的项目仍在使用GLIBC-2.27的powf和logf.实际上,我为Debian分发二进制文件非常重要,如果可以避免,我宁愿不必编译该分发版.
从历史上看,我已成功将此过程用于libc.so.6中的符号,但不是libm.so.6.我应该为libm.so.6做些不同的事吗?
显然,我在这里遗漏了一些东西,所以我将不胜感激任何提供的帮助.
非常感谢 …
我正在尝试在 ubuntu (18.04) 主机上运行一些 haskell 代码,该代码是在我的笔记本电脑上编译的。
host: 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
laptop: 4.14.74-1-MANJARO #1 SMP PREEMPT Fri Oct 5 14:16:52 UTC 2018 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我了解到这是因为我的笔记本电脑安装了 glibc 2.28 版本,但主机只有 libc6 2.27。
我做了一些谷歌搜索,认为也许 docker 可以解决这个问题。但是,我刚刚使用以下 Dockerfile 创建了一个 docker 映像,但它不起作用(相同的 GLIBC_2.28 错误)
FROM fpco/stack-build:lts-12.9 as builder
RUN mkdir /opt/build
COPY . /opt/build
RUN cd /opt/build && stack build
FROM ubuntu:18.04
RUN mkdir -p /opt/myapp
WORKDIR /opt/myapp
RUN apt-get …Run Code Online (Sandbox Code Playgroud)