- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试在 x86_64 上编译 glibc(作为辅助,而不是系统替代)2.6,并试图让它生成 32 位对象。当我给它一个标准配置时,它编译得很好,生成通常的 64 位库对象。一些信息:
$ uname -a
Linux localhost.localdomain 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:32:21 \
EST 2010 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS release 5.4 (Final)
除其他外,我尝试了以下方法:
尝试 1:
$ # [in build/glibc-2.6]
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
--with-cpu=i386-pc-linux-gnu
...
checking sysdep dirs... configure: error: The i386-pc-linux-gnu
subspecies of x86_64 is not supported."
尝试 2:
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
--host=i386-pc-linux-gnu
...
$ make
配置成功,但是 make
导致了一系列编译错误,看起来像这样:
nptl/sysdeps/i386/tls.h:65:3: error: #error "TLS support is required."
In file included from include/tls.h:6,
from sysdeps/unix/sysv/linux/i386/sysdep.h:30,
from <stdin>:1:
如果我添加 --with-tls 和/或 --target=i386-pc-linux-gnu,我会得到相同的结果。
[编辑:看起来我混淆了 --target 和 --build。我尝试添加 --build=i386-pc-linux-gnu ,也尝试添加 --target 的所有其他尝试。在所有情况下,我得到的结果与以前完全相同。]
尝试 3:
$ CFLAGS=-m32 \
../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
--host=i386-pc-linux-gnu \
...
In file included from ./../include/libc-symbols.h:55,
from <command line>:1:
/home/USER/build/glibc32-2.6/config.h:3:3: error: #error "glibc cannot be \
compiled without optimization"
再次,同样的事情发生在 --with-tls
尝试 4:
$ CFLAGS="-m32 -O2" \
../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
--host=i386-pc-linux-gnu \
...
gcc ../sysdeps/unix/sysv/linux/i386/sysdep.S -c -I../include \
-I/home/USER/build/glibc32-2.6/csu \
-I/home/USER/build/glibc32-2.6 -I../sysdeps/i386/elf \
-I../nptl/sysdeps/unix/sysv/linux/i386 \
-I../sysdeps/unix/sysv/linux/i386 \
-I../nptl/sysdeps/unix/sysv/linux \
-I../nptl/sysdeps/pthread -I../sysdeps/pthread \
-I../sysdeps/unix/sysv/linux -I../sysdeps/gnu \
-I../sysdeps/unix/common -I../sysdeps/unix/mman \
-I../sysdeps/unix/inet -I../sysdeps/unix/sysv/i386 \
-I../nptl/sysdeps/unix/sysv -I../sysdeps/unix/sysv \
-I../sysdeps/unix/i386 -I../nptl/sysdeps/unix \
-I../sysdeps/unix -I../sysdeps/posix \
-I../sysdeps/i386/fpu -I../nptl/sysdeps/i386 \
-I../sysdeps/i386 -I../sysdeps/wordsize-32 \
-I../sysdeps/ieee754/ldbl-96 \
-I../sysdeps/ieee754/dbl-64 \
-I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754 \
-I../sysdeps/generic/elf -I../sysdeps/generic \
-I../nptl -I.. -I../libio -I. \
-D_LIBC_REENTRANT -include ../include/libc-symbols.h \
-DHAVE_INITFINI -DASSEMBLER \
-I/home/USER/build/glibc32-2.6/csu/. -DGAS_SYNTAX \
-Wa,--noexecstack \
-o /home/USER/build/glibc32-2.6/csu/sysdep.o \
-MD -MP \
-MF /home/USER/build/glibc32-2.6/csu/sysdep.o.dt \
-MT /home/USER/build/glibc32-2.6/csu/sysdep.o
../sysdeps/unix/i386/sysdep.S: Assembler messages:
../sysdeps/unix/i386/sysdep.S:51: Error: @NTPOFF reloc is not supported \
with 64-bit output format
../sysdeps/unix/i386/sysdep.S:51: Error: junk `@NTPOFF' after expression
我觉得这应该更容易。我错过了什么吗?
如果您需要更多信息,请告诉我,我会提供。
[编辑]
尝试 5(由 EmployedRussian 建议)
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu
...
gcc -m32 -nostdlib -nostartfiles -shared \
-o /home/USER/build/glibc32-2.6/elf/ld.so
-Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs
/home/USER/build/glibc32-2.6/elf/librtld.os \
-Wl,--version-script=/home/USER/build/glibc32-2.6/ld.map \
-Wl,-soname=ld-linux.so.2 \
-T /home/USER/build/glibc32-2.6/elf/ld.so.lds
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `add_dependency':
/home/USER/src/glibc-2.6/elf/dl-lookup.c:106: undefined reference to `__sync_fetch_and_add_4'
/home/USER/src/glibc-2.6/elf/dl-lookup.c:110: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_profile_fixup':
/home/USER/src/glibc-2.6/elf/dl-runtime.c:196: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-runtime.c:205: undefined reference to `__sync_fetch_and_add_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_fixup':
/home/USER/src/glibc-2.6/elf/dl-runtime.c:102: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-runtime.c:110: undefined reference to `__sync_fetch_and_add_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `dl_open_worker':
/home/USER/src/glibc-2.6/elf/dl-open.c:425: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-open.c:427: undefined reference to `__sync_fetch_and_add_4'
/home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_close_worker':
/home/USER/src/glibc-2.6/elf/dl-close.c:407: undefined reference to `__sync_val_compare_and_swap_4'
/home/USER/src/glibc-2.6/elf/dl-close.c:409: undefined reference to `__sync_fetch_and_add_4'
collect2: ld returned 1 exit status
make[2]: *** [/home/USER/build/glibc32-2.6/elf/ld.so] Error 1
make[2]: Leaving directory `/home/USER/src/glibc-2.6/elf'
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory `/home/USER/src/glibc-2.6'
make: *** [all] Error 2
这次构建成功运行了很长时间才出现错误。我进行了搜索,发现一些建议我添加“-march”标志的内容,我确实这样做了。这终于奏效了:
尝试 6:
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
CC="gcc -m32" CXX="g++ -m32" \
CFLAGS="-O2 -march=i686" \
CXXFLAGS="-O2 -march=i686" \
i686-linux-gnu
谢谢大家!
最佳答案
我编辑了问题,但后来我意识到正确的方法是添加答案。这是最终起作用的方法:
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
--host=i686-linux-gnu \
--build=i686-linux-gnu \
CC="gcc -m32" CXX="g++ -m32" \
CFLAGS="-O2 -march=i686" \
CXXFLAGS="-O2 -march=i686"
我认为将 -m32
放在 CC 和 CXX 而不是 CFLAGS 和 CXXFLAGS 中很重要,因为在 make 期间至少有一个编译操作没有使用 CFLAGS 或 CXXFLAGS,并且 -m32
绝对必须始终存在。不确定为什么 -march=i686
是必需的(给定 -m32
部分和 --host/build
选项),但确实如此。
关于linux - 如何在 x86_64 机器上编译 glibc 32bit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004241/
这个问题在这里已经有了答案: Multiple glibc libraries on a single host (11 个回答) 5年前关闭。 有没有办法在本地文件夹中安装新版本的 GLIBC?我将
这个问题在这里已经有了答案: Deploying Yesod to Heroku, can't build statically (4 个回答) 1年前关闭。 我有两台机器 RHEL 4机 RHEL
我在 C 启动时读取 article ,它指的是函数 __libc_csu_init 。谁能告诉我CSU代表什么? 最佳答案 我在 libc p 中找到了对“ C s tart u p”的引用。 这远
我正在使用 AlpineLinux(安装在我的计算机上,而不是安装在 docker 中)并且我正在尝试使用依赖于 glibc 的共享库。 由于 Glibc 没有集成到这个发行版中,我看到开发了一个替代
所以我正在玩 Alpine Linux,它使用 musl 与 glibc。 我发现由于这个选择,我无法运行 Oracle Java 或在 glibc 下构建的静态二进制文件。 musl 是否应该与更广
在构建 glibc 时,出现此错误。 *glibc/build/elf/dl-allobjs.os: file not recognized: File format not recognized c
我一直在寻找没有好的结果。 我想知道在文本中解释为 Malloc Maleficarum 或 Malloc Des-Malleficarum 的技术在 glibc 2.12.1 版本中是否有效。 在提
我在 CentOS 上安装 gcc 时遇到问题。 我的命令的输出sudo yum install gcc: Loaded plugins: fastestmirror Loading mirror s
我想下载gzip类型的mariadb,但是我发现它有很多文件可以下载,例如mariadb-10.2.6-linux-x86_64.tar.gz,mariadb-10.2.6-linux-glibc_2
我想尝试使用不同的 glibc 的 sin 函数。他们是否可以在不编译整个 glibc 的情况下使用不同 glibc 版本的 sin 函数? 我已经在我的虚拟 ubuntu 机器上下载了不同版本的 g
我要在超算中心的目录下安装一个软件,但是sudo,root,连apt-get,yum都不能用...这个软件需要glibc2.7,所以我得手动安装gcc和glibc(因为我无法更改内置 gcc 的路径来
我正在研究需要在多个不同的嵌入式平台上运行的 C 和 C++ 程序,为此我有交叉编译器,因此我可以在我的 x86 桌面上进行构建。 我在某些功能上遇到了一个可怕的问题,例如“strtod()”。这是我
我遇到了一个非常烦人的问题:我有一个程序,它在开始时创建一个线程,该线程将在执行期间启动其他内容(fork() 紧随其后的是 execve())。 这是我的程序达到(我认为)死锁时两个线程的 bt:
我刚刚发现,glibc 2.23 有一个关于 stdio 函数 fmemopen() 的错误,参见例如Using rewind() on a FILE* opened with fmemopen .
[root@localhost Keystone2]# sudo rpm -ivh glibc-2.3.4-2.9.audit.x86_64.rpm --nodeps --force warning:
从该系列中很容易找到如何使用 dlsym()和其他函数,但是在内部如何工作呢?是否可以编写自己的,容易实现的dlsym()? 我想知道是否有可能实现类似的行为,但在不将与-ldl链接的情况下实现(可以
嗨,我目前使用的是 ubuntu 9.10 和 glibc 版本 2.11.1-0,好吧,我正在做一个项目,我想用 glibc 的另一个版本(2.5-58)进行测试,我想知道以下与此相关的事情: 如何
我已经下载了glibc,这样我就可以修改它的代码然后使用它。所以只是为了玩玩它,我更改了 glibc 的 stdio-common 目录中的 printf 函数,以便它打印“你可以看到我吗?”。 in
我正在集群上的 conda 环境中部署 R 脚本。该脚本加载了一些需要 glibc 版本 >= 2.14 的包。虽然我的系统的 glibc 版本为 2.14,但集群的 glibc 版本为 2.12,我
所以。我有一个问题,我在一台机器上有两个版本的 GCC。 3.4.6 和 4.1 这是由于新软件的一些依赖性问题。 (需要 glibc 4.1) 当我将这个新软件与 4.1 库链接时,它链接得很好。但
我是一名优秀的程序员,十分优秀!