Как отредактировать и перестроить исходный код библиотеки 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 на одном хосте