前言 C/C++程序需要经过代码编写、编译、链接等过程生成可执行文件,然后才能在目标机器上进行执行。Linux平台上可执行文件的格式为ELF (Executable Linkable Format),我们从ELF文件格式出发,对链接、装载过程中的一些细节进行总结。 初始ELF文件格式 从字节跳动Android PLT hook 方案 ByteHook中看到一个很好的总览ELF文件格式的...
C++对象模型实践探索
前言 C++对象模型是个常见、且复杂的话题,本文基于Itanium C++ ABI通过程序实践介绍了几种 简单C++继承 场景下对象模型,尤其是存在虚函数的场景,并通过图的方式直观表达内存布局。 本文展示的程序构建环境为Ubuntu,glibc 2.24,gcc 6.3.0。由于clang和gcc编译器都是基于Itanium C++ ABI(详细信息参考gcc ABI policy),因此...
Docker实践简要笔记
简述 有些场合需要在docker环境通过gitlab下载代码,查询资料,在docker build时可以使用SSH private key,详细可以参考: Build Docker时使用SSH Private Key的新玩法 Securely using SSH keys in Docker to access private Github repositories 参考资料 Doc...
Linux升级GLIBC的血泪教训
简述 开发环境的机器使用了Debian 9 GLIBC 2.24,而生产环境使用的是Debian 10 GLIBC 2.28,遂产生想法将开发环境也升级到GLIBC2.28,殊不知踏入大坑。 起初幼稚地认为按照网上教程编译安装GLIBC库即可,便找了个网上教程:https://www.cnblogs.com/beckyyyy/p/16911058.html,进行至make install...
Linux进程内存问题排查
0 前言 本文主要记录Linux环境进程内存问题的排查方法。 1 内存泄漏排查 Linux环境进程内存泄漏通常使用Valgrind工具进行排查,使用的命令如下: valgrind --trace-children=yes --show-reachable=yes --leak-check=full --show-leak-kinds=all --trake-origins=yes yo...
TCP KeepAlive机制理解与实践小结
0 前言 本文将主要通过抓包并查看报文的方式学习TCP KeepAlive机制,以此加深理解。 1 TCP KeepAlive机制简介 TCP长连接下,客户端和服务器若长时间无数据交互情况下,若一方出现异常情况关闭连接,抑或是连接中间路由出于某种机制断开连接,而此时另一方不知道对方状态而一直维护连接,浪费系统资源的同时,也会引起下次数据交互时出错。 为了解决此问题,引入了TCP Ke...
学习笔记-TCL
Tcl 脚本初窥 // helloWorld.tcl #!/usr/bin/tclsh // 脚本解释器 puts "Hello World!" 1. Tcl 基本语法 1.1 命令语法 commandName argument1 argument2 ... argumentN 1.2 命令替换 在命令替换,方括号是用来计算在方括号中的脚本。 #!/usr/bin/tcls...
学习笔记-Swig
1. Introduction SWIG (Simplified Wrapper and Interface Generator) SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages...
学习笔记-Shell Script
shell脚本初窥 例子:test #!/bin/sh cd ~ mkdir shell_txt cd shell_txt for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释: 第1行:指定脚本解释器(声明使用的shell名称),这里是用/bin/sh做解释器的。“#!”是一个约定的标记 第2行:切换到当前...
学习笔记-Python
Python 脚本初窥 #!/usr/bin/python // 告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释器 print "Hello, Python!"; #!/usr/bin/env python // 这种用法是为了防止操作系统用户没有将 python 装在默认的 /usr/bin 路径 // 里。当系统看到这一行的时候,首先会到 env ...