特定のコンパイラオプションを使用してlibstdc ++をコンパイルする方法は?

特定のコンパイラオプションを使用してlibstdc ++をコンパイルする方法は?

可能であれば、プロファイリング目的でオプションを使用してlibstdc ++をコンパイルしたいと思います-fno-omit-frame-pointer。以下でlibstdc ++を構築することができました。https://gcc.gnu.org/install/index.htmlところで、このオプションをどのように設定しますか?このCXXFLAGSアプローチはうまくいきませんでした。

答え1

ヒントhttps://www.linuxfromscratch.org/lfs/view/stable/chapter06/gcc-pass2.html

テストビルド....

tar xvf gcc-10.3.0.tar.xz
mkdir BUILD__libstdc++103
cd BUILD__libstdc++103/

../gcc-10.3.0/libstdc++-v3/configure \
    CXXFLAGS="-g -O2 -D_GNU_SOURCE -fno-omit-frame-pointer" \
    --prefix=/home/knudfl/BUILD__libstdc++103/usr \
    --disable-multilib --disable-libstdcxx-pch 

make
make install

問題がないようです。テキストが-fno-omit-frame-pointer端末出力に表示されますmake

答え2

最小限の段階的な例

ソースからのGCCのコンパイル。単純化されたコマンド:

sudo apt-get build-dep gcc
git clone git://gcc.gnu.org/git/gcc.git
cd gcc
git checkout gcc-6_4_0-release
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-languages=c,c++ --prefix="$(pwd)/install"
make -j`nproc`

30分から2時間ほどお待ちください。それでは、このテストプログラムを試してみましょうa.cpp

#include <cassert>
#include <queue>

int main() {
    std::priority_queue<int> q;
    q.emplace(2);
    q.emplace(1);
    q.emplace(3);
    assert(q.top() == 3);
    q.pop();
    assert(q.top() == 2);
    q.pop();
    assert(q.top() == 1);
    q.pop();
}

まず、コンパイルして実行して、初期コンパイルが機能していることを確認してください。

gcc/build/install/bin/g++ -g -std=c++11 -O0 -o a.out ./a.cpp
./a.out

priority_queueそれでは、コンストラクタを修正してみましょう。

まず、次のようにGDBを使用して実際のコンストラクタを簡単に見つけることができます。https://stackoverflow.com/questions/11266360/when-should-i-use-make-heap-vs-priority-queue/51945521#51945521

だから私たちはこのパッチを通してこの問題を解決しました。

diff --git a/libstdc++-v3/include/bits/stl_queue.h b/libstdc++-v3/include/bits/stl_queue.h
index 5d255e7300b..deec7bc4d99 100644
--- a/libstdc++-v3/include/bits/stl_queue.h
+++ b/libstdc++-v3/include/bits/stl_queue.h
@@ -61,6 +61,7 @@
 #if __cplusplus >= 201103L
 # include <bits/uses_allocator.h>
 #endif
+#include <iostream>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -444,7 +445,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       priority_queue(const _Compare& __x = _Compare(),
             _Sequence&& __s = _Sequence())
       : c(std::move(__s)), comp(__x)
-      { std::make_heap(c.begin(), c.end(), comp); }
+      {
+        std::cout << "hacked" << std::endl;
+        std::make_heap(c.begin(), c.end(), comp);
+      }
 
       template<typename _Alloc, typename _Requires = _Uses<_Alloc>>
    explicit

その後、libstdc ++を再構築して再インストールすることで、多くの時間を節約できます。

cd gcc/build/x86_64-pc-linux-gnu/libstdc++-v3
make -j`nproc`
make install

これで、次のビルドと実行:

gcc/build/install/bin/g++ -g -std=c++11 -O0 -o a.out ./a.cpp
./a.out

出力:

hacked

Ubuntu 16.04でテストされました。

glibc

ボーナスとして、Cにも興味があるなら:https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host/52454603#52454603

関連:

関連情報