文章目录

  • 获取版本
  • 构建安装
  • 测试
    • testrun.sh
    • strace

获取版本

主页:https://www.gnu.org/software/libc



这里选择任意一个压缩包下载即可。

构建安装

tar -Jxf glibc-2.34.tar.xz
mkdir build install
cd build
../glibc-2.34/configure --prefix=/usr
make -j4
make install DESTDIR=/xxx/xxx/install

1)make后面的-j4,其中4可以根据CPU数进行调整。
2)DESTDIR需要是绝对路径
3)configure阶段可能会检测某些软件不存在,根据错误提示在主机上安装即可
4)如果使用vmware虚拟机,build目录不能在Linux和Windows共享目录下,否则会构建错误

测试

下面写一个打印hello world的c程序,基于构建的glibc-2.34进行执行。

1)程序 test.c

#include <stdio.h>int main(void)
{printf("hello world\n");return 0;
}

2)编译

gcc test.c

3)执行
基于build目录下的testrun.sh进行执行

$ /xxx/xxx/build/testrun.sh ./a.out
hello world

更多测试方法可以参考 glibc 知:构建和测试

testrun.sh

#!/bin/bash
builddir=`dirname "$0"`
GCONV_PATH="${builddir}/iconvdata"usage () {cat << EOF
Usage: $0 [OPTIONS] <program> [ARGUMENTS...]--tool=TOOL  Run with the specified TOOL. It can be strace, valgrind orcontainer. The container will run within support/test-container.
EOFexit 1
}toolname=default
while test $# -gt 0 ; docase "$1" in--tool=*)toolname="${1:7}"shift;;--*)usage;;*)break;;esac
doneif test $# -eq 0 ; thenusage
ficase "$toolname" indefault)exec   env GCONV_PATH="${builddir}"/iconvdata LOCPATH="${builddir}"/localedata LC_ALL=C  "${builddir}"/elf/ld-linux-x86-64.so.2 --library-path "${builddir}":"${builddir}"/math:"${builddir}"/elf:"${builddir}"/dlfcn:"${builddir}"/nss:"${builddir}"/nis:"${builddir}"/rt:"${builddir}"/resolv:"${builddir}"/mathvec:"${builddir}"/support:"${builddir}"/crypt:"${builddir}"/nptl ${1+"$@"};;strace)exec strace  -EGCONV_PATH=/home/maminjie/glibc/build/iconvdata  -ELOCPATH=/home/maminjie/glibc/build/localedata  -ELC_ALL=C  /home/maminjie/glibc/build/elf/ld-linux-x86-64.so.2 --library-path /home/maminjie/glibc/build:/home/maminjie/glibc/build/math:/home/maminjie/glibc/build/elf:/home/maminjie/glibc/build/dlfcn:/home/maminjie/glibc/build/nss:/home/maminjie/glibc/build/nis:/home/maminjie/glibc/build/rt:/home/maminjie/glibc/build/resolv:/home/maminjie/glibc/build/mathvec:/home/maminjie/glibc/build/support:/home/maminjie/glibc/build/crypt:/home/maminjie/glibc/build/nptl ${1+"$@"};;valgrind)exec env GCONV_PATH=/home/maminjie/glibc/build/iconvdata LOCPATH=/home/maminjie/glibc/build/localedata LC_ALL=C valgrind  /home/maminjie/glibc/build/elf/ld-linux-x86-64.so.2 --library-path /home/maminjie/glibc/build:/home/maminjie/glibc/build/math:/home/maminjie/glibc/build/elf:/home/maminjie/glibc/build/dlfcn:/home/maminjie/glibc/build/nss:/home/maminjie/glibc/build/nis:/home/maminjie/glibc/build/rt:/home/maminjie/glibc/build/resolv:/home/maminjie/glibc/build/mathvec:/home/maminjie/glibc/build/support:/home/maminjie/glibc/build/crypt:/home/maminjie/glibc/build/nptl ${1+"$@"};;container)exec env GCONV_PATH=/home/maminjie/glibc/build/iconvdata LOCPATH=/home/maminjie/glibc/build/localedata LC_ALL=C  /home/maminjie/glibc/build/elf/ld-linux-x86-64.so.2 --library-path /home/maminjie/glibc/build:/home/maminjie/glibc/build/math:/home/maminjie/glibc/build/elf:/home/maminjie/glibc/build/dlfcn:/home/maminjie/glibc/build/nss:/home/maminjie/glibc/build/nis:/home/maminjie/glibc/build/rt:/home/maminjie/glibc/build/resolv:/home/maminjie/glibc/build/mathvec:/home/maminjie/glibc/build/support:/home/maminjie/glibc/build/crypt:/home/maminjie/glibc/build/nptl /home/maminjie/glibc/build/support/test-container env GCONV_PATH=/home/maminjie/glibc/build/iconvdata LOCPATH=/home/maminjie/glibc/build/localedata LC_ALL=C  /home/maminjie/glibc/build/elf/ld-linux-x86-64.so.2 --library-path /home/maminjie/glibc/build:/home/maminjie/glibc/build/math:/home/maminjie/glibc/build/elf:/home/maminjie/glibc/build/dlfcn:/home/maminjie/glibc/build/nss:/home/maminjie/glibc/build/nis:/home/maminjie/glibc/build/rt:/home/maminjie/glibc/build/resolv:/home/maminjie/glibc/build/mathvec:/home/maminjie/glibc/build/support:/home/maminjie/glibc/build/crypt:/home/maminjie/glibc/build/nptl ${1+"$@"};;*)usage;;
esac

简析如下:

  case "$1" in--tool=*)toolname="${1:7}"shift;;

toolname为参数1的从索引7开始的字符,即去掉–tool=,默认toolname为default,则执行下面命令:
exec env GCONV_PATH="${builddir}"/iconvdata LOCPATH="${builddir}"/localedata LC_ALL=C "${builddir}"/elf/ld-linux-x86-64.so.2 --library-path "${builddir}":"${builddir}"/math:"${builddir}"/elf:"${builddir}"/dlfcn:"${builddir}"/nss:"${builddir}"/nis:"${builddir}"/rt:"${builddir}"/resolv:"${builddir}"/mathvec:"${builddir}"/support:"${builddir}"/crypt:"${builddir}"/nptl ${1+"$@"}

通过 ld-linux-x86-64.so.2 的参数 --library-path 设置库的路径,然后加载程序。

${1+"$@"}:当$1定义了,取$@,否则取$1

ld-linux-x86-64.so.2 的更多参数可以参考 glibc 知:ld.so

strace

maminjie@fedora hello]$ ~/glibc/build/testrun.sh --tool=strace ./a.out
execve("/home/maminjie/glibc/build/elf/ld-linux-x86-64.so.2", ["/home/maminjie/glibc/build/elf/l"..., "--library-path", "/home/maminjie/glibc/build:/home"..., "./a.out"], 0x55d73ba1d6d0 /* 48 vars */) = 0
brk(NULL)                               = 0x555556d2e000
openat(AT_FDCWD, "./a.out", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\2\0>\0\1\0\0\0@\20@\0\0\0\0\0"..., 832) = 832
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\200\0\300\4\0\0\0\1\0\0\0\0\0\0\0", 32, 824) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\316\235\274\210\275\254]\372\27.\202\255\7\31\206\214"..., 68, 856) = 68
getcwd("/home/maminjie/glibc/test/hello", 128) = 32
mmap(0x400000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x400000
mmap(0x401000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x401000
mmap(0x402000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x402000
mmap(0x403000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x403000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f76f94b5000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/glibc-hwcaps/x86-64-v3/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/glibc-hwcaps/x86-64-v3", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/glibc-hwcaps/x86-64-v2/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/glibc-hwcaps/x86-64-v2", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/tls/haswell/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/tls/haswell/x86_64", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/tls/haswell/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/tls/haswell", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/tls/x86_64", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/tls", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/haswell/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/haswell/x86_64", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/haswell/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/haswell", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
newfstatat(AT_FDCWD, "/home/maminjie/glibc/build/x86_64", 0x7ffef39e8740, 0) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/maminjie/glibc/build/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\324\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\200\0\300\4\0\0\0\1\0\0\0\0\0\0\0", 32, 848) = 32
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\374&\320\320\314/\277I\361\270j\317\266`\246\365"..., 68, 880) = 68
newfstatat(3, "", {st_mode=S_IFREG|0775, st_size=12478512, ...}, AT_EMPTY_PATH) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2079920, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f76f92b9000
mprotect(0x7f76f92e5000, 1822720, PROT_NONE) = 0
mmap(0x7f76f92e5000, 1470464, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2c000) = 0x7f76f92e5000
mmap(0x7f76f944c000, 348160, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x193000) = 0x7f76f944c000
mmap(0x7f76f94a2000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e8000) = 0x7f76f94a2000
mmap(0x7f76f94a8000, 52400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f76f94a8000
close(3)                                = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f76f92b6000
arch_prctl(ARCH_SET_FS, 0x7f76f92b6740) = 0
set_tid_address(0x7f76f92b6a10)         = 64383
set_robust_list(0x7f76f92b6a20, 24)     = 0
mprotect(0x7f76f94a2000, 12288, PROT_READ) = 0
mprotect(0x403000, 4096, PROT_READ)     = 0
mprotect(0x7f76f94e6000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
newfstatat(1, "", {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x1), ...}, AT_EMPTY_PATH) = 0
getrandom("\x10\xe9\x7d\x23\x41\xbe\xe9\x34", 8, GRND_NONBLOCK) = 8
brk(NULL)                               = 0x555556d2e000
brk(0x555556d4f000)                     = 0x555556d4f000
write(1, "hello world\n", 12hello world
)           = 12
exit_group(0)                           = ?
+++ exited with 0 +++
[maminjie@fedora hello]$

glibc 知:构建2.34版本相关推荐

  1. glibc 知:构建和测试

    文章目录 1. 前言 2. 构建 2.1. 只构建不安装 2.2. 构建并安装 3. 测试 3.1. 正常编译应用,在新glibc下运行 3.2. 基于glibc构建树进行编译应用 3.3. 基于gl ...

  2. glibc 知:测试套件

    文章目录 前言 测试套件目标 只测试一项测试 ABI检查 有关 make xcheck 特定测试的详细信息 编写测试用例 使用交叉编译器进行测试 已知的测试套件失败 abi-check bug-ate ...

  3. Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子

    Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子         一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...

  4. Cocos Creator -构建打包 所有版本测试

    Cocos Creator -构建打包 所有版本测试 目前在打包APK时,出现了种种问题,都是因为打包环境操作,所以为了解决所有同行的同惑 ***大菠萝***做了一系列测评 SDK26 SDK27 S ...

  5. 如何看待快手领投知乎4.34亿美元融资?创始人周源亲自下场回答

    8月12日,知乎创始人周源发布全员信,确认已完成4.34亿美元,此轮融资由快手领投.百度跟投,腾讯和今日资本等原有投资方继续跟投.这也是知乎迄今为止规模最大的融资之一. 有网友在知乎提问,如何看待快手 ...

  6. glibc 知:系统调用

    文章目录 1. 简介 2. 包装器 2.1. 汇编系统调用 2.2. 宏系统调用 2.3. 定制系统调用 3. 汇编系统调用详解 3.1. syscalls.list 3.2. assembly sy ...

  7. glibc 知:官方

    文章目录 1. 官网 1.1. What is glibc?什么是glibc 1.2. Get started 开始 1.3. Get Involved 参与其中 1.4. Sources 源码 1. ...

  8. 【Git笔记2】必知习惯和如何版本回退

    良好的习惯会让工作和生活如鱼得水,在使用git的时候有些必知习惯和概念你要get一下,总有些许失误,如:已经提交了不合适的修改到版本库时还没有把自己的本地版本库推送到远程,想要撤销本次提交,或者已经p ...

  9. glibc 知:手册05:字符串和数组

    文章目录 1. 前言 2. 字符串和数组实用程序 2.1. 字符串的表示 2.2. 字符串和数组约定 2.3. 字符串长度 2.4. 复制字符串和数组 2.5. 连接字符串 2.6. 复制时截断字符串 ...

最新文章

  1. Windows Live Writer发布测试
  2. NA-NP-IE系列实验之前三个实验小结
  3. Android:展开/折叠动画
  4. 161. Leetcode 55. 跳跃游戏 (贪心算法-贪心区间)
  5. SpringCloud(第 003 篇)服务发现服务端EurekaServer微服务
  6. C++Primer:函数(参数传递-非引用形参)
  7. 过完年,又不想上班了?
  8. CompletableFuture详解~allOf
  9. element table多选只能选中当前页数据_关于“列表多选”操作流的小思考
  10. 使用AJAX时出现“Microsoft JScript 运行时错误: 'Sys' 未定义”提示的解决方法
  11. 计算机课禁用监视器,win7系统防止别人偷窥电脑的操作方法
  12. 参考文献在论文中进行引用标注
  13. 分享一下支付宝的支付(soEasy)
  14. VideoProc for mac(全能视频处理软件)
  15. JQuery弹幕发送
  16. VMWare虚拟机 网络连接模式介绍
  17. Excel工具类(详细版)
  18. Windows 下无痛安装 TensorFlow (GPU版)
  19. Java 第十一届 蓝桥杯 省模拟赛 反倍数
  20. VMware10下Mac OS X 10.9系统VMware Tools的安装

热门文章

  1. linux指令英文含义,Linux —— 常见指令及其英文全称
  2. Solidworks在哪里找到内六角螺钉 内六角螺栓保准件
  3. Mac版 下载安装FFmpeg
  4. 获取当前手机的IP地址
  5. 高效能人士的七个习惯经典名言摘录
  6. 如何修复烧写镜像文件失败的SD卡
  7. Pygame实战:记忆差怎么办?别急,增强记忆力的小游戏送给你~【越玩越上瘾】
  8. 以太大亨 以太坊上的区块链模拟经营类游戏
  9. CCNA考试流程及注意事项(详细)
  10. JavaScript apply 和 call 和 bind,原型和原型链的理解