- 博客(29)
- 资源 (1)
- 收藏
- 关注
原创 clang交叉编译
在c++的开发过程中,经常会因为要跨平台编译而切换环境,非常麻烦,如果你希望能在自己的开发机器上就可以编译出来目标机器的二进制。clang是一个不错的编译器。可以指定一个target就可以轻松编译出来目标机器可运行的代码。 clang++ --target=aarch64-pc-freebsd --sysroot=$HOME/farm_tree -fuse-ld=lld -stdlib=libc++ -o zpipe zpipe.cc -lz --verbosesysroot是可以指定你目标机器上
2022-01-23 23:07:19 3647 2
原创 visual studio(vs)中使用__FILE__宏打印log的时候,会打印出来绝对路径
我们往往在调试的时候,并不要求把文件路径的所有都打印出来,太长了,不易观看。只需要打印个文件名就好了。在vs中如下设置下就好了:
2022-01-13 14:41:29 599
转载 git-分支创建合并于解决冲突
分支创建于合并首先,我们创建dev分支,然后切换到dev分支:$ git checkout -b devSwitched to a new branch 'dev'git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:$ git branch dev$ git checkout devSwitched to branch 'dev'然后,用git branch命令查看当前分支:$ git branch* dev mastergit branch命令会列出
2021-04-29 23:14:50 326
转载 Windows下使用Beyond Compare作为git的比对与合并工具
使用图形客户端进行差异比较和合并冲突比较直观,因此使用Beyond Compare作为git的比对与合并工具。打开 C:\Users\Administrator.gitconfig 文件,添加如下内容diff[diff] tool = bc4[difftool "bc4"] cmd = "\"c:/Program Files/Beyond Compare 4/BComp.exe\" \"$LOCAL\" \"$REMOTE\""merge[merge] tool = b
2021-04-25 23:39:11 985
原创 git命令日常使用积累
1.git 提交代码流程1.git add .2.git commit -m “”3.git pull --rebase:可能会提示冲突4.解决冲突之后,首先git add(注意不需要进行commit),git rebase --continue.一直到没有冲突为止。(每次解决冲突之后,需要git add)5.再进行提交。2.git版本回退1.使用git log查看提交记录。查找到你的commit号2.git reset --hard “commit 号”3.stash的
2021-04-24 21:30:30 134
原创 reinterpret_cast
reinterpret_cast用于进行各种不同类型的转换不同类型指针之间不同类型引用之间指针和能容纳指针的整数类型之间的转换编译期处理,执行的是逐字节复制的操作类似于显式强转,后果自负#include "stdafx.h"#include <iostream>#include <string>using namespace std;void foo(){ cout << "foo()" << endl;
2021-04-21 23:31:57 971
原创 dynamic_cast
dynamic_cast用于具有虚函数的基类与派生类之间的指针或引用的转换。基类必须具备虚函数原因:dynamic_cast是运行时类型检查,需要运行时类型信息(RTTI),而这个信息是存储与类的虚函数表关系紧密,只有一个类定义了虚函数,才会有虚函数表。运行时检查,转型不成功则返回一个空指针非必要不要使用dynamic_cast,有额外的函数开销常见的转换方式:基类指针或引用转派生类指针(必须使用dynamic_cast)派生类指针或引用转基类指针(可以使用dynam
2021-04-21 23:31:10 200
原创 强制转换运算符----const_cast
强制转换运算符----const_cast强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。C++ 引入新的强制类型转换机制强制转换运算符C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:const_caststatic_castreinterpret_castdynamic_castC语言强制类型转换缺点:主要是为了克服C语言强制类型
2021-04-21 23:30:05 332
原创 static_cast
static_cast基本等价于隐式转换的一种类型转换运算符,以前是编译器自动隐式转换,static_cast可使用于需要明确隐式转换的地方。c++中用static_cast用来表示明确的转换。#include <iostream>int main(){ int n = -1; char ch = 'a'; double dle = 0.1; dle = n; //c语言中的隐式转换 dle = static_cast<double&g
2021-04-21 23:29:25 21366
原创 nullptr 与 constexpr
(1)nullptrnullptr 出现的目的是为了替代 NULL。在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。C++ 不允许直接将 void * 隐式转换到其他类型,但如果 NULL 被定义为 ((void*)0),那么当编译 char *ch = NULL; 时,NULL 只好被定义为 0。而这依然会产生问题,将导致了 C++ 中重载特性会发生混乱,考虑:v
2021-04-19 22:16:13 248
原创 在c++中,有时候需要把一些公共的部分提取出来一个.h中,然后在每个需要的地方去包含这个头文件。这个时候一般会出现重定义。
在c++中,有时候需要把一些公共的部分提取出来一个.h中,然后在每个需要的地方去包含这个头文件。这个时候一般会出现重定义。例如:有个文件是common.hconst char * SS5_SERVER_IP = "44.211.15.90";const int SS5_SERVER_PORT = 10808;const int TEST_UDP_PORT = 10888;然后在a.cpp和b.cpp中去包含的时候,在连接的时候就会出现重定义。原因就是在编译完的每个.o中上面这份代码都定义了,在连
2021-04-19 22:11:52 269
原创 c++编译和链接的过程,有助于理解常见的编译错误
c++编译和链接的过程,有助于理解常见的编译错误1.预编译这一步可以粗略的理解为只做一件事“宏展开”,#include会用源文件替换。2.编译编译器通过后缀名来辨识是否编译该文件,因此“.h”的头文件一概不理会,而“.cpp”的源文件一律都要被编译.编译是一个个独立的文件作为单元的,一个文件就会编译出一个目标文件,这一点很重要,因此编译只负责本单元的事情,而对外部的事情一概不理会。在这里,我们可以调用一个函数而不必给出这个函数的定义,但是要在调用前得到这个函数的声明。其实这就是include的本质
2021-04-19 22:10:03 181
原创 函数指针,强制类型转换
函数指针,强制类型转换我定义了一些函数指针,然后在内核中拿到这些一些函数的地址,把这些地址直接赋值给这个函数指针。但是这个过程可能要做一些强制类型转换 。对于函数指针的强制类型转换如下: int(*kernel_security_inode_unlink)(struct inode *, struct dentry *);//定义了一个函数指针 // printk(KERN_INFO "hooked unlink filename:%s\n",filename);kernel_security_i
2021-04-19 22:04:16 385
原创 函数指针,强制类型转换
函数指针,强制类型转换我定义了一些函数指针,然后在内核中拿到这些一些函数的地址,把这些地址直接赋值给这个函数指针。但是这个过程可能要做一些强制类型转换 。对于函数指针的强制类型转换如下: int(*kernel_security_inode_unlink)(struct inode *, struct dentry *);//定义了一个函数指针 // printk(KERN_INFO "hooked unlink filename:%s\n",filename);kernel_security_i
2021-04-19 22:02:56 1091
原创 开发中的小知识点积累
1.类名后面带final表示该类是不能被继承的,如果继承了会编译错误class bootstrap final 2.匿名的命名空间在c中,我们一般使用static让函数只作用与本文件(.c)中。在c++中,与之类似的做法是在文件中声明一个匿名的命名空间,将只是要作用于本文件的函数放置到这个匿名的命名空间。namespace { void test(){ //这个函数只是作用于本文件中 }}...
2021-04-19 22:01:04 101
原创 extern “C“(详细剖析)
在工作中,经常看到如下代码:#ifdef __cplusplusextern "c" {#endif#include <typedef.h>#include <errcode.h>typedef void * my_handle_t;my_handle_t create_handle(const char* name);void close_handle()#ifdef __cplusplus}#endif这与C++有什么关系呢? 看看__cplusplu
2021-04-19 21:56:04 309
原创 Linux 下头文件包含,静态链接,动态链接等默认搜索的系统路径。
Linux 下头文件包含,静态链接,动态链接等默认搜索的系统路径。1. 头文件路径#include <>直接到系统指定的某些目录中去找某些头文件。#include “”先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件。那么gcc如何确定头文件搜索路径呢?默认路径/usr/include命令行指定gcc -I xxxx文件路径有多种,那么先后顺序如何?1. -I 指定的路径2. gcc 环境变量指定的路径C_INCLUDE_PATH, CPLUS_INCLU
2021-04-19 21:40:21 309
原创 c++继承解决的是代码复用的问题
1.继承this的问题#include <iostream>class A {private: int a;public: void setA(int a_) { this->a = a_; } void printfA(){ printf("a:%d\n",this->a); }};class B : public A {
2021-04-19 21:38:48 199
原创 c++ 实现简易mvvm架构模型,不知道对不对
最近因为要用c++实现mvvm。对这些架构(MVC, MVP, MVVM)雨里雾里。看了一些文章介绍,总体觉得mvvm除了前后端分离,解耦,最大的特点是数据的双向绑定,即当view改变时,可以通过viewmodel自动改变model,当model改变时,也可以通过viewmodel自动改变view。如果理解偏差,前辈们多多指点。感谢!实现思路:采用回调函数的方法:即在view初始化的时候bind一个修改view自身数据的function。 同样在初始化model的时候,bind一个修改model自身的
2021-03-09 17:29:25 2011 4
原创 使用katana-parser解析css文件
katana-parser的安装参考github官网。下面是一个解析css的demo:#include <stdio.h>#include <stdlib.h>#include <sys/timeb.h>#include "katana.h"/*g++ css-parser.cpp `pkg-config --cflags --libs katana`./a.out test.csseg : test.css: hr {color: sien
2021-02-06 21:45:04 314
原创 使用linux内核提供的c接口来加载bpf程序
有时候可能,你使用不了bcc等库。这个时候就需要自己使用纯c来编译和load bpf程序,在探索的过程中,遇到了各种文件找不到的情况。根据编译提示,最终在内核源码树中都找到了对应的文件和函数。所以,在自己使用纯c来加载bpf程序的时候,需要下载一份内核源码.以下为demo#include <linux/bpf.h>#define SEC(NAME) __attribute__((section(NAME), used))static int (*bpf_trace_printk)(c
2020-12-31 15:19:10 1013 1
原创 parallels共享目录中cp文件skipping file ‘foo‘, as it was replaced while being copied
本质是inode的问题。在vagranfile加:config.vm.synced_folder "~/Projekte", "/var/www", mount_options: ["share", "noatime", "host_inodes"]
2020-11-27 16:17:59 998
原创 在内核模块中判断网络是否是wifi网卡
最近遇到一个需求是在内核中(确切的说是netfilter中),判断当前协议栈上的网卡是否是WiFi网卡。具体的判断是在netfiter的上下文中会得到一个net_device的结构体。该结构体中有一个字段是ieee80211_ptr 。如果该字段不为NULL的话,则判断该网卡就是wifi的无线网卡在发数据。参考:https://stackoverflow.com/questions/15119928/how-to-get-information-about-wireless-net-devices.
2020-10-26 21:33:00 134
原创 BPF程序类型及其原理
bpf都可以干啥为了回到这个问题,我们在bpf.h中看到了一些bpf类型的枚举定义:enum bpf_prog_type { BPF_PROG_TYPE_UNSPEC, BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_KPROBE, BPF_PROG_TYPE_SCHED_CLS, BPF_PROG_TYPE_SCHED_ACT, BPF_PROG_TYPE_TRACEPOINT, BPF_PROG_TYPE_
2020-08-05 15:55:31 6342
原创 BPF虚拟文件系统是干什么的,以及它的作用
BPF最基本的的特征是基于文件描述符的映射,这意味着,当文件描述符关闭之后,这个map中的其他信息都会丢失。BPF的map是用于很短暂的隔离程序,他们不会share信息。随着时间的发展,开发人员需要保存Map中的信息,即使是相关的文件描述符已经关闭了。kenerl4.4引入了两个syscall,允许bpf程序从虚拟文件系统固定和获取map。固定到此文件系统的Maps和BPF程序将在创建它们的程序终止后仍然保留在内存中。BPF默认的虚拟文件路径是在/sys/fs/bpf下,陪你可以使用下面的命令挂载虚拟文件
2020-06-06 16:10:28 4441 3
原创 基于c语言的BPF程序
当你在使用BPF程序时,你需要去指定哪种类型的程序在运行。类型将会告诉程序,你的代码将在内核的哪个地方被执行。同时,它也会告诉BPF虚拟机的verifier,哪种类型的bpf helper将会被允许使用。当你选择了程序类型,你同时也选择了你的代码要实现的相关接口。该接口将确保你可以访问你想要的数据、想要获取的网络包等等。1.开始你的第一个BPF程序BPF程序的编译,一般使用LLVM.LLVM是一种genreal-purpose 的编译器,LLVM可以emit不同的字节码。在本章中,LLVM将生成bpf的
2020-06-02 13:27:38 2792 1
原创 一文搞懂所有bpf程序分类
bpf的程序可以分为两大类:第一大类是tracing,可以帮助你更好的理解系统发生了什么,例如:cpu和内存的使用情况等。第二大类就是networking,主要可以帮助你检查和处理网络流量,它可以允许你filter或者reject网络数据包,不同的网络类型程序,可以发生在网络的不同阶段。2.Socket Filter ProgramsBPF_PROG_TYPE_SOCKET_FILTER是第一个被添加到内核的程序类型。当你attach一个bpf程序到socket上,你可以获取到被socket处理的所有数
2020-06-01 15:48:48 4129
原创 patch 命令出错(fuzz)
最近使用patch给kernel打补丁的时候,遇到一个诡异的问题。发现patch会把没匹配上的代码也打上去。这会导致失败。经过对比,发现patch还有个模糊匹配打patch.而且还有个默认的factor为2.所以说为了安全起见,还是关闭默认的fuzz-F 0再结合dry-run去探测是否能打成功。...
2019-12-19 13:58:00 1431
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人