繁体   English   中英

如何编辑和重新构建GCC libstdc ++ C ++标准库源代码?

[英]How to edit and re-build the GCC libstdc++ C++ standard library source?

我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验。 具体而言,我对试验并行排序算法感兴趣。 有没有一个地方我可以找到文档来轻松编辑和构建源代码?

我试过构建各种版本的libstdc ++库,但没有成功。 似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件。

我也一直无法找到包含并行排序算法的源文件。 我似乎只能找到定义函数的头文件,而不是源代码本身。 任何建议或文档链接将不胜感激。

是的,你必须构建整个GCC,但是一旦你完成了,你只需要重建libstdc ++部分。

建立GCC的方法见http://gcc.gnu.org/wiki/InstallingGCC

libstdc ++源代码位于libstdc++-v3目录中。 并行算法在libstdc++-v3/include/parallel ,它们是模板,所以所有代码都在头文件中。 少量的非标头代码在libstdc++-v3/src/c++98/parallel-settings.cc

要从顶级构建目录重建libstdc ++,请进入$TARGET/libstdc++-v3目录(其中$TARGET类似于x86_64-unknown-linux-gnu )并运行make

最小的一步一步的例子

从源代码编译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分钟到两个小时。 现在让我们使用这个测试程序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轻松找到实际的构造函数,如下所述: 我何时应该使用make_heap与Priority Queue?

所以我们用这个补丁搞定了:

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: 单个主机上的多个glibc库感兴趣

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM