Linux下使用-static -lpthread靜態編譯出現段錯誤(Segmentation fault)
最近在看golang,感覺go的靜態編譯思想很不錯。於是準備把手頭的幾個專案靜態編譯一下,結果編譯的時候沒報任何警告及錯誤,一執行就報段錯誤(Segmentation fault)。gdb逐步除錯,發現問題出在std::thread那裡。仔細檢查了下所有語法,沒發現任何問題。關鍵是動態編譯一切正常,加了-static靜態編譯就會出現這個問題。
Google才發現這是一個bug,std::thread Segmentation fault static linking
解決方案有兩個:
1.引數加上
-Wl,--whole-archive -lpthread -Wl,--no-whole -archive
如:
g++ -std=c++11 -O3 -Wall -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive main.cpp -o test
2.用boost::thread代替std::thread。
注意: 此現象只會出現在debian系/SUSE系等Linux系統,紅帽系沒發現這個問題。
相關推薦
Linux下使用-static -lpthread靜態編譯出現段錯誤(Segmentation fault)
最近在看golang,感覺go的靜態編譯思想很不錯。於是準備把手頭的幾個專案靜態編譯一下,結果編譯的時候沒報任何警告及錯誤,一執行就報段錯誤(Segmentation fault)。gdb逐步除錯,發現問題出在std::thread那裡。仔細檢查了下所有語法,沒
Linux下的段錯誤(Segmentation fault)產生的原因及除錯方法
段錯誤 就是訪問了錯誤的記憶體段,一般是你沒有許可權,或者根本就不存在對應的實體記憶體,尤其常見的是訪問0地址. 一 般來說,段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個值是由gdtr來儲存的是一個48位的暫存器, 前32位是儲存由它指
C/C++中的段錯誤(Segmentation fault)
}3)其他其實大概的原因都是一樣的,就是段錯誤的定義。但是更多的容易出錯的地方就要自己不斷積累,不段發現,或者吸納前人已經積累的經驗,並且注意避免再次發生。例如:<1>定義了指標後記得初始化,在使用的時候記得判斷是否為NULL<2>在使用陣列的時候是否被初始化,陣列下標是否越界,陣列元
你的java/c/c++程式崩潰了?揭祕段錯誤(Segmentation fault)(3)
前言 接上兩篇: 寫到這裡,越跟,越發現真的是核心上很白,非一般的白。 但是既然是研究,就定住心,把段錯誤搞到清楚明白。 本篇將作為終篇,來結束這個系列,也算是對段錯誤和程式除錯、尋找崩潰原因(通常不會給你那麼完美的stackstrace和人性化的錯
Linux 程式設計段錯誤(segmentation error)總結
最近一段時間在linux下用C做一些學習和開發,但是由於經驗不足,問題多多。而段錯誤就是讓我非常頭痛的一個問題。不過,目前寫一個一千行左右的程式碼,也很少出現段錯誤,或者是即使出現了,也很容易找出來,並且處理掉。 那什麼是段錯誤?段錯誤為什麼是個麻煩事?以及怎麼發現程
嵌入式 使用gdb除錯段錯誤(segment fault)
我們打算使用gdb去解決為什麼下面的程式(檔案為segfault.c)引起了段錯誤的問題。下面的這段程式是從使用者那裡讀入一行文字字串然後顯示在螢幕上。然而,如下當前的程式並不會如期執行... [cpp] view plaincopyprint? <s
使用gdb除錯段錯誤(segment fault)
我們打算使用gdb去解決為什麼下面的程式(檔案為segfault.c)引起了段錯誤的問題。下面的這段程式是從使用者那裡讀入一行文字字串然後顯示在螢幕上。然而,如下當前的程式並不會如期執行... #include <stdio.h> #include <
Linux下KVM的圖形界面管理工具(virt-manager)(桌面版)
工具 .html mage 使用 get pre shel viso 而且 背景: virt-manager是用於管理KVM虛擬環境的主要工具,virt-manager默認設置下需要使用root用戶才能夠使用該工具。當你想在KVM hypervisor服務器上托管虛擬機,
Linux下,為應用程式新增桌面圖示(ubuntu18.4)
一、桌面圖示位置 Lniux下桌面圖示儲存路徑為:/usr/share/applications 二、桌面圖示格式 所有桌面圖示格式均為desktop,即名為XXX.desktop 三、編輯內容(常用) // 檔案頭(必須) [Desktop Entry] /
linux 下命令下載tomcat8.5.28和jdk8(連結可用)
tomcat命令:wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie"http://archive.apache.org/dist/tomcat/tom
linux下基於vc088x開發板分析CLK模型(時鐘管理)
Linux clk 模型 Linux clk模型採用面向物件的思想來設計實現的。 在porting層建立一個一個的clk節點物件,然後將所有的clk節點物件連成一個list。 當驅動層需要設定時鐘的時候,通過porting層與驅動層
在Linux下搭建屬於你自己的git伺服器(MAC版)
環境說明 本地mac系統,一般都有git程式安裝(如果沒有則使用:brew install git) 伺服器版本是ubuntu-14.04 直入主題 使用mac終端遠端連線linux伺服器(命令:ssh [伺服器ip], 之後輸入伺服器密碼)預設都是ro
linux下搭建svn添加多個倉庫(項目)
con 加權 linu 刪除 密碼 etc none tar cep 1): 創建svn版本庫路徑 mkdir -p /opt/svn/project1 mkdir -p /opt/svn/project2 ...
linux下一些簡單的命令或快捷鍵(不斷更新)
顯示日曆:cal [month] [year] 計算器:bc 退出quit Tab鍵:對當前資料夾下的檔案進行顯示提示,當前輸入的命令進行提示 ctrl+c:停止當前的操作 ctrl+d:離開當前所編輯的文字等 who:檢視但錢線上人 netstat -a:聯機狀
linux下利用openssl來實現證書的頒發(詳細步驟)
1、首先需要安裝openssl,一個開源的實現加解密和證書的專業系統。在centos下可以利用yum安裝。 2、openssl的配置檔案是openssl.cnf,我們一般就是用預設配置就可以。如果證書有特殊要求的話,可以修改配置適應需求。這樣必須把相關的檔案放到配置檔
Linux 下父程序與子程序的通訊(pipe管道)
每個程序各自有不同的使用者地址空間,任 何一個程序的全域性變數在另一個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝 區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊(IPC,Inte
ASP.NET Core Linux下為 dotnet 創建守護進程(必備知識)
linux中 ice -s 收藏 lin 守護 shutdown stderr spn 原文:ASP.NET Core Linux下為 dotnet 創建守護進程(必備知識)前言 在上篇文章中介紹了如何在 Docker 容器中部署我們的 asp.net core 應用程
linux下使用free命令檢視實際記憶體佔用(可用記憶體)
轉:http://blog.is36.com/linux_free_command_for_memory/ linux下在終端環境下可以使用free命令看到系統實際使用記憶體的情況,一般用free -m方式檢視記憶體佔用情況(兆為單位)。而系統實際可用記憶體是不是f
Nginx知多少系列之(十四)Linux下.NET Core專案Nginx+Keepalived高可用(主從模式)
目錄 1.前言 2.安裝 3.配置檔案詳解 4.工作原理 5.Linux下託管.NET Core專案 6.Linux下.NET Core專案負載均衡 7.負載均衡策略 8.加權輪詢(round robin)策略剖析 9.IP雜湊(ip hash)策略剖析 10.最少連線(least_conn)策略剖析 11
本地連線Windows Server2012R2+MySQL出現2003錯誤(已解決)
最近開發小程式,因為要儲存使用者資料,所以把我以前在騰訊雲買的伺服器拿來用了。我的伺服器是老早以前買的,所以那時候為了圖省事,買的是WindowsServer2012R2。在服務端裝好資料庫後,我卻在本地端訪問不了,出現的錯誤是 2003:Can't c