1. 程式人生 > >tcmalloc庫兩種用法的符號替換原理

tcmalloc庫兩種用法的符號替換原理

利用LD_PRELOAD來載入tcmalloc庫那麼使用者呼叫malloc肯定是走到tcmalloc中;在編譯時顯式連結tcmalloc庫如何保證在執行時,malloc符號是繫結到tcmalloc內的?僅通過動態庫載入順序?還是有其它機制?試驗x86_64平臺。寫一個hello小程式,呼叫一次malloc函式。利用如下命令來檢視依賴庫及malloc符號的繫結結果:objdump -x a.out |grep NEEDEDLD_DEBUG=bindings ./a.out試驗1:不連結tcmalloc[[email protected] hello]$ objdump a.out -x |grep NEEDED NEEDED libc.so.6[
[email protected]
hello]$ LD_DEBUG=bindings ./a.out 5363: initialize program: ./a.out 5363: 5363: 5363: transferring control: ./a.out 5363: 5363: binding file ./a.out [0] to /lib64/libc.so.6 [0]: normal symbol `malloc' [GLIBC_2.2.5] 5363: binding file ./a.out [0] to /lib64/libc.so.6 [0]: normal symbol `memset' [GLIBC_2.2.5] 5363: 5363: calling fini: ./a.out [0]試驗2:僅顯式連結tcmalloc
[[email protected] hello]$ gcc hello.c -ltcmalloc[[email protected] hello]$ objdump a.out -x |grep NEEDED NEEDED libtcmalloc.so.4 NEEDED libc.so.6[[email protected] hello]$ LD_DEBUG=bindings ./a.out 5414: initialize program: ./a.out 5414: 5414: 5414: transferring control: ./a.out 5414: 5414: binding file ./a.out [0] to /lib64/libtcmalloc.so.4 [0]: normal symbol `malloc' 5414: binding file ./a.out [0] to /lib64/libc.so.6 [0]: normal symbol `memset' [GLIBC_2.2.5] 5414: 5414: calling fini: ./a.out [0]試驗3:顯式連結libc和tcmalloc,libc在前
[[email protected] hello]$ gcc hello.c -lc -ltcmalloc[[email protected] hello]$ objdump a.out -x |grep NEEDED NEEDED libc.so.6 NEEDED libtcmalloc.so.4[[email protected] hello]$ LD_DEBUG=bindings ./a.out 5463: initialize program: ./a.out 5463: 5463: 5463: transferring control: ./a.out 5463: 5463: binding file ./a.out [0] to /lib64/libc.so.6 [0]: normal symbol `malloc' [GLIBC_2.2.5] 5463: binding file ./a.out [0] to /lib64/libc.so.6 [0]: normal symbol `memset' [GLIBC_2.2.5] 5463: 5463: calling fini: ./a.out [0]試驗4:顯式連結libc和tcmalloc,tcmalloc在前[[email protected] hello]$ gcc hello.c -ltcmalloc -lc[[email protected] hello]$ objdump a.out -x |grep NEEDED NEEDED libtcmalloc.so.4 NEEDED libc.so.6[[email protected] hello]$ LD_DEBUG=bindings ./a.out 5501: initialize program: ./a.out 5501: 5501: 5501: transferring control: ./a.out 5501: 5501: binding file ./a.out [0] to /lib64/libtcmalloc.so.4 [0]: normal symbol `malloc' 5501: binding file ./a.out [0] to /lib64/libc.so.6 [0]: normal symbol `memset' [GLIBC_2.2.5] 5501: 5501: calling fini: ./a.out [0]結論經過上述測試驗證(也作了libstdc++ / new函式的測試),當顯式連結libtcmalloc時,程序的malloc/new最終能不能調到tcmalloc中,取決於程序對動態庫的依賴順序。如果編譯軟體時,既顯式連結libc(或libstdc++),又顯式連結libtcmalloc,那麼必須保證先連結tcmalloc再連結libc(或libstdc++),否則,malloc/new函式還是被繫結到原生的libc(或libstdc++)中。延伸:程序載入多個依賴庫時,可以選擇廣度優先遍歷載入,也可以選擇深度優先遍歷載入,不同的載入策略,會導致某些動態庫的載入順序發生變化,如果多個動態庫中含有相同的動態符號,那麼會產生不同的符號繫結結果。但對於tcmalloc來說,只要不顯示連結libc(或libstdc++),一般就沒什麼問題,因為不管廣度優先還是深度優先,tcmalloc必然在libc(libstdc++)之前先被載入。

相關推薦

tcmalloc用法符號替換原理

利用LD_PRELOAD來載入tcmalloc庫那麼使用者呼叫malloc肯定是走到tcmalloc中;在編譯時顯式連結tcmalloc庫如何保證在執行時,malloc符號是繫結到tcmalloc內的?僅通過動態庫載入順序?還是有其它機制?試驗x86_64平臺。寫一個hell

#include指令載入外部用法

C中可以通過#include <header.h>和#include "header.h"來載入檔案,兩者的區別主要是在include載入的搜尋路徑上存在不同。 區別是: 採用#incl

奪命雷公狗C/C++-----5---include的用法

編寫 logs ima log -1 們的 頭文件 技術 我們 我們的include是有兩種用法的,如: 上面這種就是在頭文件方式進行引入的, include <> 括號的是包含系統文件的。。。。 還有一種,比如我首先寫個頭文件先,如下所示:

java基礎——Collections.sort的用法

基本類 == 輸出結果 code sed java 意思 size htm Collections是一個工具類,sort是其中的靜態方法,是用來對List類型進行排序的,它有兩種參數形式: public static <T extends Comparabl

spring 事務的用法

frame basic 版本 supports 4.2 將不 cts eas 間接 spring事務兩種使用方法 [email protected] 註解 2.AOP 配置 xml (需要依賴包:aopalliance-1.0.jar/ aspectjweav

go--->共享內存和通信並發模式原理探究

表現 cond 原理 second chan listen 今天 想象 unlock 共享內存和通信兩種並發模式原理探究 並發理解 人類發明計算機編程的本質目的是為了什麽呢?毫無疑問是為了解決人類社會中的各種負責業務場景問題。ok,有了這個出發點,那麽想象一下,比如你既可

ssh認證方式的原理介紹

SSH是一種加密的網路傳輸協議,可在不安全的網路中為網路服務提供安全的傳輸環境。SSH通過在網路中建立安全隧道來實現SSH客戶端與伺服器之間的連線。雖然任何網路服務都可以通過SSH實現安全傳輸,SSH最常見的用途是遠端登入系統,人們通常利用SSH來傳輸命令列介面和遠端執行命令。ssh 協議互

jsp中include 的用法

1.兩種用法 靜態include:  <%@ inlcude file =”header.jsp” %> 此時引入的是靜態的jsp檔案,它將引入的jsp中的原始碼原封不動地附加到當前檔案中,所以在jsp程式中使用這個指令的時候file裡面的值(即要匯入的檔案)不能帶多餘

git commit --amend用法

一、如果已經push到遠端伺服器,想修改已經提交過的commit資訊 1.儲存:Ctrl + o; 回車 ;退出:Ctrl + x # git commit --amend 2.重新提交gerrit審批 # git push --no-thin origin HEAD:refs/fo

oracle goldengate的用法

此文已由作者趙欣授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 自從oracle收購來了goldengate這款產品並以後對它做了一系列改進後,有非常多的使用者使用它做資料遷移、etl抽取、複製容災等等場景。 這裡還有兩個goldengate的另類用法,也是非常實用。 1.通過da

智聯招聘抓取---scrapy框架和requests方式實現

#首先分析目標站點,分析得出結果是在json接口裡,然後抓取企業資訊需要再次請求頁面進行抓取 #1.直接requests請求進行抓取儲存 ##需要注意點: 可能不同企業單頁排版不一樣,需要判斷採取不同形式 儲存為csv檔案注意格式,保證資料表格不換行需要新增

@ResponseBody的用法

第一種用法,方法頭部: /** * @todo * @param request * @return */ @ResponseBody @RequestMapping(value="model",method = RequestMethod.POST)

jsp中include的用法

<%@ include file=” ”%> include指令 <jsp:include page=” ” flush=”true”/> include動作 主要有兩方面的不同: 1.執行時間上 <%@ include file=” ”

Collections.sort的用法

Collections是一個工具類,sort是其中的靜態方法,是用來對List型別進行排序的,它有兩種引數形式: public static <T extends Comparable<? super T>> void sort(List

微信小程式開發之get請和post請求的用法

我們在開發微信小程式,需要進行資料請求,這裡只有get和post兩種.get請求,如下圖 但是呢,在很多情況下光只有get請求是不行的,還必須要有post請求,那麼post請求怎麼寫呢,如下圖 這

Item 42:typename的用法

Item 42: Understand the two meanings of typename. 時至今日還有人在論壇裡問模板引數前的typename和class有何區別: template<typename T> class Widge

PHP foreach的用法

前言:         php4中引入了foreach結構,這是一種遍歷陣列的簡單方式。相比傳統的for迴圈,foreach能夠更加便捷的獲取鍵值對。在php5之前,foreach僅能用於陣列;php

Sql server 事務的用法

事務機制: 四個屬性:原子性Atomicity,一致性Consistency,隔離性Isolation,永續性Durability ,即ACID特性。 事務的狀態:活動狀態(初始狀態),部分提交狀態(事務執行完最後一條語句,實際輸出可能臨時駐留在記憶體中),提交狀態(當資料庫系統將事務中對資料的梗概完全

JAVA中super的用法

http://www.cnblogs.com/rollenholt/articles/2033989.html 通過用static來定義方法或成員,為我們程式設計提供了某種便利,從某種程度上可以說它類似於C語言中的全域性函式和全域性變數。但是,並不是說有了這種便利,你便可以隨處使用,如果那樣的話,你

JAVA EE 專案常用知識 之AJAX技術實現select下拉列表聯動的用法(讓你真正理解ajax)

ajax 下拉列表聯動的用法。 ajax的定義: AJAX 是一種用於建立快速動態網頁的技術。 通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。 ajax效果的一個例子: 區域為