Using Pbuilder to (Cross-)Build Debian Packages

One day I wanted to build a program for a 64-bit ARM OS with basic dpkg support. Since its binaries for x86 and the corresponding source code had been adapted and maintained as Debian packages by several distros, an easy way for me would be to grab the source code of one package, cross-build it for ARM 64 architecture, …

C++ 中的 Name Mangling

关于 C++ Name Mangling 的故事,还要从 C 语言说起。 C 语言的场景 在 C 语言中,一个函数的函数名唯一标识这个函数。换另外两个表述: 不同函数的界定与区分只看函数名,与返回值、入参类型和个数等因素皆无关; 出现多个相同函数名的函数定义意味着重定义错误。 1void foo() { } 2void foo(int a) { } // error: redefinition of ‘foo’ 3int foo() { } // error: conflicting types for ‘foo’ C 语言的这种对函数的处理比较原始,但也有好处。这里涉及到一个背景知识:C/C++ 源代码经过编译器编译后,编译器会用 …

用 GDB 调试动态链接库

前言 写本文的目的是为了记录一个【基于 GDB 对动态链接库(DSO1)的错误进行调试】的过程,重要的内容包括: 获取进程发生错误时的状态; 查看进程在该状态下的内存分布; 在 GDB 中用正确地址加载符号表,以恢复函数调用堆栈。 本文主要参考了 Ubuntu Wiki 上的这篇博文 。按照其版权及许可证要求,本文采用 Creative Commons Attribution-ShareAlike 3.0 进行许可。 Hybris 简介 Libhybris 是一种关于 libc 库兼容问题的解决方案,让我们在基于 GNU C Library (Glibc)的系统上2可以运行用 Bionic 编译的库(主要是 Android …

【C++ 小问答】4:数值运算中的小类型隐式转换

问 如下哪段代码有整数溢出: 1int Func(short a, short b) 2{ 3 return (a + b); 4} 1int Func(signed char a, signed char b) 2{ 3 return (a + b); 4} 1long long int Func(int a, int b) 2{ 3 return (a + b); 4} 1long long int Func(int a, int b) 2{ 3 return ((long long int)a + b); 4} 答 导致整数溢出最常见的场景,是在数值计算中没有对较小类型的操作数做恰当的类型转换1。而上述的前三段代码看起来都涉及 …

打印 C++ 类的内存排布

C++ 类的各个成员在内存中的布局,一般是通过理论推导和各种旁敲侧击的手段来大致得出的。实际上,我们可以获得更全面,更确信的材料:让编译器直接告诉我们某个类在内存中的实际排布。 MSVC 在 Visual Studio 中添加 /d1 reportAllClassLayout 或 /d1 reportSingleClassLayout<类名> 这两个编译参数:前者打印所有类,后者打印某一个类。以此代码为例: 1class Base { 2public: 3 Base() : a(0) {} 4 virtual ~Base() {}; 5 6 virtual void Func1() {}; 7 virtual void …