http://www.sysnote.org/2015/08/25/use-new-glibc/

通常情况下我们都是直接使用glibc提供的一些库函数,但是某些特殊的情况,比如要修改glibc的一些代码或者加入glibc的一些编译选项或者要使用其他版本的glibc,我们就需要重新编译glibc。
编译glibc时特别要注意,不能去替换系统自带的glibc,因为glibc作为linux系统的核心库,很多底层模块都依赖它,稍有不慎就会把系统搞挂掉。因此我们编译glibc时最好要指定prefix=/new/path,
这样编译完了之后make install的时候就不会去覆盖系统自带的版本。那么问题来了,编译好glibc后,如何让我们的程序使用这个新编译的glibc呢?下面就以我们实际编译glibc的步骤来说明。

1.下载glibc源代码

http://www.gnu.org/software/libc/,在官网上有各个glibc的发行版,这里我选用的是glibc-2.17

2.解压glibc到当前目录

1
root@xxx:~# tar zxvf glibc-2.17.tar.gz

3.创建glibc的build目录

不能在glibc-2.17源码目录下./configure,会报错“configure: error: you must configure in a separate build directory”

1
root@xxx:~# mkdir -p build/glibc-build

4.configure glibc

这里我指定了自己需要的一些编译选项,并且指定prefix目录

1
root@xxx:~/build/glibc-build# /root/glibc-2.17/configure CFLAGS="-fno-builtin-strlen -ggdb -O2" FEATURES="preserve-libs nostrip splitdebug" --prefix=/root/build/glibc-build

5.编译安装

1
2
root@xxx:~/build/glibc-build# make -j10
root@xxx:~/build/glibc-build# make install

可以看到glibc相关的库都在glibc-build目录下了

1
2
3
4
5
6
7
8
9
10
11
root@xxx:~/build/glibc-build# ls lib
audit libanl.so libcidn.so libdl.a libm.so.6 libnss_db.so.2 libnss_nis-2.17.so libpthread.so librt.so.1 Scrt1.o
crt1.o libanl.so.1 libcidn.so.1 libdl.so libnsl-2.17.so libnss_dns-2.17.so libnss_nisplus-2.17.so libpthread.so.0 libSegFault.so
crti.o libBrokenLocale-2.17.so libc_nonshared.a libdl.so.2 libnsl.a libnss_dns.so libnss_nisplus.so libresolv-2.17.so libthread_db-1.0.so
crtn.o libBrokenLocale.a libcrypt-2.17.so libg.a libnsl.so libnss_dns.so.2 libnss_nisplus.so.2 libresolv.a libthread_db.so
gconv libBrokenLocale.so libcrypt.a libieee.a libnsl.so.1 libnss_files-2.17.so libnss_nis.so libresolv.so libthread_db.so.1
gcrt1.o libBrokenLocale.so.1 libcrypt.so libm-2.17.so libnss_compat-2.17.so libnss_files.so libnss_nis.so.2 libresolv.so.2 libutil-2.17.so
ld-2.17.so libbsd-compat.a libcrypt.so.1 libm.a libnss_compat.so libnss_files.so.2 libpcprofile.so librpcsvc.a libutil.a
ld-linux-x86-64.so.2 libc-2.17.so libc.so libmcheck.a libnss_compat.so.2 libnss_hesiod-2.17.so libpthread-2.17.so librt-2.17.so libutil.so
libanl-2.17.so libc.a libc.so.6 libmemusage.so libnss_db-2.17.so libnss_hesiod.so libpthread.a librt.a libutil.so.1
libanl.a libcidn-2.17.so libdl-2.17.so libm.so libnss_db.so libnss_hesiod.so.2 libpthread_nonshared.a librt.so Mcrt1.o

6.使用新的glibc来编译程序,这里我编译的是valgrind

1
2
3
4
root@xxx:~# tar jxvf valgrind-3.10.1.tar.bz2
root@xxx:~# mkdir -p build/valgrind-build
root@xxx:~# cd valgrind-3.10.1
root@xxx:~/valgrind-3.10.1# ./configure CFLAGS="-I/root/build/glibc-build/include" LDFLAGS="-L/home/nbs/glibc/lib -Wl,--rpath=/root/build/glibc-build/lib -Wl,--dynamic-linker=/root/build/glibc-build/lib/ld-linux-x86-64.so.2" --prefix=/root/build/valgrind-build

下面对configure的选项进行说明:
CFLAGS=”-I/root/build/glibc-build/include” 这个是指定头文件的查找路径,去新编译的glibc里查找
LDFLAGS: Makefile的链接选项,其中
-L: 告诉链接器先从指定的路径查找库来链接,如果没找到,再从默认的地方找。编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。
可以设定LD_LIBRARY_PATH来让程序在运行时查找除默认路径(默认是先搜索/lib和/usr/lib这两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径)之外的其他路径,不过LD_LIBRARY_PATH的设定作用是全局的,建议使用gcc的的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。
因此我在上面指定了-Wl,–rpath=/root/build/glibc-build/lib,说明一下,-Wl,option是将选项传给链接器

另外,也需要使用新编译的链接器,使用–dynamic-linker指定链接器
然后再使用make && make install就可以编译完成,完成后,可以看到安装的东西都在/root/build/valgrind-build/下。

GCC:

export PKG_CONFIG_PATH=/usr/local/gcc/gcc-4.9.3/lib/pkgconfig:$PKG_CONFIG_PATH

export LD_LIBRARY_PATH=/usr/local/gcc/gcc-4.9.3/lib64:/usr/local/gcc/gcc-4.9.3/lib:$LD_LIBRARY_PATH

export C_INCLUDE_PATH=/usr/local/gcc/gcc-4.9.3/include:$C_INCLUDE_PATH

PATH=/usr/local/gcc/gcc-4.9.3/bin/:$PATH

如何使用新的glibc来编译自己的程序的更多相关文章

  1. House of apple 一种新的glibc中IO攻击方法

    目录 House of apple 一种新的glibc中IO攻击方法 前言 利用条件 利用原理 利用思路 思路一:修改tcache线程变量 思路二:修改mp_结构体 思路三:修改pointer_gua ...

  2. 编译LOADCEPC.EXE程序

    1.安装编译工具 安装MSVC152路径C:/MSVC; 安装MASM611可以自己指定E:/MASM611; 命令行编译 相关文件配置 修改setupen2.bat 如下: :PATH_DONE s ...

  3. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  4. 静态编译C/C++程序

    静态编译C/C++程序,让程序运行不受平台限制 由于Linux操作系统的特有elf加载顺序. (可以参考此文). 虽然可以很大程度上解决Windows早期版本的dll hell问题, 但是给部署带来了 ...

  5. Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库

    目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...

  6. 如何在linux 32位机器编译64位程序

    编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序. 编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64 ...

  7. centos64位编译32位程序

    test.c #include <stdio.h> int main() { printf("sizeof long is %d\n",sizeof(long)); ; ...

  8. Cmake知识----编写CMakeLists.txt文件编译C/C++程序(转)

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  9. Spring Native 项目,把 Spring 项目编译成原生程序!

    Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...

随机推荐

  1. JavaScript语言精粹 笔记02 函数

    函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆   函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字 ...

  2. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  3. ibatis源码学习3_源码包结构

    ibatis的技术是从xml里面字符串转换成JAVA对象,对象填充JDBC的statement查询,然后从resultset取对象返回,另外利用ThreadLocal实现线程安全,JDBC保证了事务控 ...

  4. 27款经典的CSS框架

    利用 CSS 框架,可以简化你的工作,提高工作效率.CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块.下面给你推荐了27款优秀的CSS框 ...

  5. android之实现底部TabHost

    先说布局文件,如下:利用android:layout_alignParentBottom="true" 实现底部显示 <?xml version="1.0" ...

  6. uwsgi启动Django项目时:unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode ***

    说起来有点坑 用命令都能正常启动,但是用配置文件就是不行 提示 unable to load app (mountpoint='') (callable not found or import err ...

  7. OLEDB导入导出Excel

    using System;using System.Collections.Generic;using System.Data;using System.Data.OleDb;using System ...

  8. iis7下站点日志默认位置

    在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置. 但是在iis7下,iis管理器下的日志配置只能找到iis日志配置的主目录,但到底在哪个子目录,则无法直接获知.     后来在主日 ...

  9. MyBatis框架流程

    Hibernate与Mybatis的本质区别和应用场景 Hibernate:标准的ORM框架,不需要写SQL语句,但是优化和修改SQL语句比较难. 应用于需求变化固定的中小型的项目,例如后台管理系统. ...

  10. Flink学习笔记:Time的故事

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...