Как отредактировать и перестроить исходный код библиотеки GCC libstdC++ C++?

Я работаю над некоторыми исследованиями и хотел бы отредактировать часть исходного кода в библиотеке libstdC++ для экспериментов. Мне особенно интересно экспериментировать с алгоритмами параллельной сортировки. Есть ли место, где я могу найти документацию для удобного редактирования и сборки исходного кода?

Я безуспешно пытался собрать различные версии библиотеки libstdC++. Кажется, что большинство новых версий требуют сборки всего пакета gcc, что является гораздо более длительным процессом, особенно если я собираюсь редактировать и экспериментировать с несколькими файлами в libstdC++.

Я также не смог найти исходные файлы, которые содержат алгоритмы параллельной сортировки. Я могу только найти файлы заголовков, которые определяют функции, а не сам исходный код. Любые советы или ссылки на документацию будут с благодарностью.

2 ответа

Решение

Да, вам нужно собрать весь 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 на одном хосте

Другие вопросы по тегам