如何使用新的glibc来编译自己的程序
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 |
root@xxx:~/build/glibc-build# make -j10 |
可以看到glibc相关的库都在glibc-build目录下了
1 |
root@xxx:~/build/glibc-build# ls lib |
6.使用新的glibc来编译程序,这里我编译的是valgrind
1 |
root@xxx:~# tar jxvf valgrind-3.10.1.tar.bz2 |
下面对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来编译自己的程序的更多相关文章
- House of apple 一种新的glibc中IO攻击方法
目录 House of apple 一种新的glibc中IO攻击方法 前言 利用条件 利用原理 利用思路 思路一:修改tcache线程变量 思路二:修改mp_结构体 思路三:修改pointer_gua ...
- 编译LOADCEPC.EXE程序
1.安装编译工具 安装MSVC152路径C:/MSVC; 安装MASM611可以自己指定E:/MASM611; 命令行编译 相关文件配置 修改setupen2.bat 如下: :PATH_DONE s ...
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序
1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...
- 静态编译C/C++程序
静态编译C/C++程序,让程序运行不受平台限制 由于Linux操作系统的特有elf加载顺序. (可以参考此文). 虽然可以很大程度上解决Windows早期版本的dll hell问题, 但是给部署带来了 ...
- Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库
目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...
- 如何在linux 32位机器编译64位程序
编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序. 编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64 ...
- centos64位编译32位程序
test.c #include <stdio.h> int main() { printf("sizeof long is %d\n",sizeof(long)); ; ...
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序(转)
1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...
- Spring Native 项目,把 Spring 项目编译成原生程序!
Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...
随机推荐
- post上传文件限制--另一种解决途径
问题:项目之前的上传功能是没有问题的,但是今天同样的代码上传一个压缩包的时候出现了问题,报的是struts.xml的错,说是找不到返回的映射, 问题截图: 很奇怪的问题,之前都没问题的,仔细对比后发现 ...
- [转载]Java集合系列大全总结
Java 集合系列目录(Category) 22:06:49 2019-02-27
- Tomcat安装JPress
上线代码有两种方式,第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不多说了.第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面.下面让我们 ...
- 从源码角度看Transaction以及如何手工接管Transaction实现高度的自定义化
一:transaction CUD: 在一个transaction中... transaction: start add.... delete... update... transaction: co ...
- python读写Excel文件(xlrd、xlwr)
一.首先需要安装第三方库:pip install xlrd 1.打开Excel文件,由于写入时需要copy,所以这里加上保留原格式参数:formatting_info=True excel_file ...
- QPushButton 点击信号分析
QPushButton 点击信号分析 QPushButton有三个很重要的信号跟点击有关 pressed clicked toggled 表面上看,pressed和clicked都会在点击按钮时触发, ...
- linux最基本命令
1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到 ...
- Android 增量更新研究
Android 增量更新实例(Smart App Updates) http://blog.csdn.net/duguang77/article/details/17676797 Android AP ...
- CYJian的水题大赛2 解题报告
这场比赛是前几天洛谷上 暮雪﹃紛紛dalao的个人公开赛,当时基本上都在水暴力分......也没有好好写正解(可能除了T1) 过了几天颓废的日子之后,本蒟蒻觉得应该卓越一下了qwq,所以就打算写一个解 ...
- python 小点
python中列表不能除以列表,列表不能除以整数.浮点数. numpy数组可以实现数组除以整数.