HP-UX 的 libc 具有fesetflushtozero在 \xe2\x80\x9c 渐进下溢\xe2\x80\x9d 和 \xe2\x80\x9cflush 到零\xe2\x80\x9d 之间切换浮点行为的功能。
尽管梳理了几个 Unix libc(包括 glibc)的文档和手册页,我还没有找到如何在其他 Unices 中实现同样的事情。我对 Linux/glibc、Solaris 和 AIX 特别感兴趣。
\n我正在 Ubuntu 10.10(VirtualBox 中的 32 位)中编译 glibc-2.12.1。步骤如下:
[我正在从一个新目录构建它]
我在运行 make 时遇到以下错误:
gcc ../sysdeps/i386/fpu/s_frexp.S -c -D__NO_MATH_INLINES -D__LIBC_INTERNAL_MATH_INLINES -I../include -I/home/l33thckr/Installations/glibc-build/math -I/home/l33thckr/Installations/glibc-build -I../sysdeps/i386/elf -I../nptl/sysdeps/unix/sysv/linux/i386/i686 -I../sysdeps/unix/sysv/linux/i386/i686 -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/i686/fpu -I../sysdeps/i386/i686/multiarch -I../nptl/sysdeps/i386/i686 -I../sysdeps/i386/i686 -I../sysdeps/i386/i486 -I../nptl/sysdeps/i386/i486 -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 -DPIC -DSHARED -DASSEMBLER -DGAS_SYNTAX -Wa,--noexecstack -Wa,-mtune=i686 -o /home/l33thckr/Installations/glibc-build/math/s_frexp.os -MD -MP -MF /home/l33thckr/Installations/glibc-build/math/s_frexp.os.dt -MT /home/l33thckr/Installations/glibc-build/math/s_frexp.os …Run Code Online (Sandbox Code Playgroud) 我知道ld.so属于glibc,我想修改它的源代码并单独构建它。但是构建整个 glibc 太繁重了,而且 makefile 也太复杂了,我不知道从哪里开始挖掘。有小费吗?
我必须使用 psycopg2 以 postgresql 作为后端在服务器上运行一个龙卷风 web 应用程序。我正在开发 Red Hat Enterprise Linux Server 版本 6.5。我设置了一个虚拟环境。现在,在这台服务器上,我没有 root 访问权限,无法使用 pip 或 yum,也无法从服务器复制文本(因此我无法发布确切的错误日志)。我一直在手动下载库的 tar 文件并安装它们。当我尝试运行 web 应用程序时,出现以下错误:
ImportError: /lib/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib/libpq.so.5)
Run Code Online (Sandbox Code Playgroud)
libc.so.6 的版本是 2.12。该错误显示在 psycopg2/ init.py中。
我很抱歉,这没什么可继续的,但服务器有很多限制。任何帮助将不胜感激。
我的问题是关于 glibc。bk成员的名字是什么的缩写malloc_chunk?
struct malloc_chunk {
INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T mchunk_size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
Run Code Online (Sandbox Code Playgroud)
参考:https : //code.woboq.org/userspace/glibc/malloc/malloc.c.html#malloc_chunk
我尝试遵循https://cs.lmu.edu/~ray/notes/nasmtutorial/提供的一个非常简单的示例。我特意在下面一行注释,以确保堆栈没有按照 x64 调用约定的要求与 16 字节边界对齐。但仍然程序继续工作。请有人回答为什么不遵守调用约定,我期待某种分段错误。
; sub rsp, 8 ; must align stack before call
Run Code Online (Sandbox Code Playgroud)
为了运行这个程序:(Ubuntu 20.04 lts,gcc 9.3.0)
nasm -felf64 echo.asm && gcc echo.o && ./a.out 123ABC
Run Code Online (Sandbox Code Playgroud)
; -----------------------------------------------------------------------------
; A 64-bit program that displays its command line arguments, one per line.
;
; On entry, rdi will contain argc and rsi will contain argv.
; -----------------------------------------------------------------------------
global main
extern puts
section .text
main:
push rdi ; save registers that puts uses
push rsi
; sub rsp, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用musl工具链编译各种程序,例如 MariaDB 。也就是说,我不希望在编译完成后对 glibc 或 GNU 的链接器有任何依赖。
到目前为止,我一直在使用 musl 的 GCC 包装器musl-gcc来编译东西。但是,对于像 MariaDB 这样的大型程序,我很难获得所有必要的库和标头,并且符号链接或添加编译环境变量并没有真正的帮助。
我在这个 GitHub 存储库中看到提到构建一个针对 musl libc 的交叉编译器以及附加文档和代码。来自交叉编译器的文档:
这为您提供了一个完整的、可重定位的 musl 目标工具链,具有 C++ 支持和自己的库路径,您可以将第三方库安装到其中。
听起来这可以帮助我,但我不确定这与 musl 的 GCC 包装器有什么不同,据我所知,它只是改变了 GCC 寻找库和头文件等的位置。
最终,我不确定这个交叉编译器与 GCC 包装器到底有多大不同,以及它对我的情况是否有用。当我可以符号链接到现有库并使用 GCC 包装器时,为什么我需要自己的库路径来安装第三方库?交叉编译器是我应该编译的方式吗,尤其是更大的代码库?
我编译了以下示例代码:
#cat array_addition.c
#define MAX 1000000
#define S 1024
#include <string.h>
int a[S], b[S], c[S];
__attribute__((target_clones("avx512f", "avx2","arch=atom","default")))
void foo(int argc){
int i,x;
for (x=0; x<1024; x++){
for (i=0; i<S; i++){
a[i] = b[i] + c[i];
}
}
b[0] = argc;
memcpy(&a[0], &b[0], argc *sizeof(int));
}
int main(int argc, char** argv) {
foo(argc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中调用 memcpy;
从 objdump 中,我们可以发现它会调用 GLIBC memcpy:
#readelf -r a.out
Relocation section '.rela.dyn' at offset 0x418 contains 1 entry:
Offset Info Type Sym. Value Sym. …Run Code Online (Sandbox Code Playgroud) 如果我使用 pthread 函数,我必须在 GCC 上使用“-lpthread”参数以确保正确链接。但是,为什么 GCC 在链接其他标准函数时不需要额外的参数?示例:printf、scanf、POSIX 套接字等。