
gcc
文章平均质量分 50
Farmwang
博采众长,兼收并蓄!
展开
-
Strace 命令使用 gcc
strace strace命令性能监测与优化 strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的转载 2017-06-09 15:08:29 · 444 阅读 · 0 评论 -
undefined reference to `cvRound'
最近在使用opencv时报 undefined reference to `cvRound' 错误查找原因是安装opencv3.2版本时错误,更新到2.4.13 成功1原创 2017-06-23 07:21:32 · 3157 阅读 · 0 评论 -
从程序员角度看ELF
原文:《 ELF:From The Programmer's Perspective》作者:Hongjiu Lu NYNEX Science & Technology, Inc. 500 Westchester Avenue White Plains, NY 10604, USA 翻译:alert7转载 2017-06-13 21:17:12 · 642 阅读 · 0 评论 -
读Kernel感悟-Linux内核启动-从hello world说起
内核是从哪里开始执行的呢?几乎任何一本Linux内核源代码分析的书都会给出详细的答案。不过,我试图从一个不同的角度(一个初学者的角度)来叙述,而不是一上来就给出答案。从熟悉的事物入手,慢慢接近陌生的事物,这是比较常见的思路。既然都是二进制代码,那么不妨从最简单的用户态C程序,hello world开始。说不定能找到共同点。恰好我是一个喜欢寻根究底的人。也许,理解了hello world程序的启动过转载 2017-06-13 21:30:13 · 430 阅读 · 0 评论 -
dynamic-linker
-dynamic-linker file 设置动态连接器(dynamic linker)的名字。默认的动态连接器或者是/lib64/ld-linux-x86-64.so.2 或者是/usr/lib/libd1.so.1装载附加的共享库在ELF系统上,为了执行一个ELF文件,内核要把控制权交给动态连接器/lib64/ld-li原创 2017-06-13 22:06:18 · 6665 阅读 · 0 评论 -
crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o
crt是c runtime 的缩写,用于执行进入main之前的初始化和退出main之后的扫尾工作。crt1.o, crti.o, crtbegin.o, crtend.o, crtn.o 等目标文件和daemon.o(由我们自己的C程序文件产生)链接成一个执行文件。前面这5个目标文件的作用分别是启动、初始化、构造、析构和结束,它们 通常会被自动链接到应用程序中So,在标准的li转载 2017-06-13 22:11:57 · 11380 阅读 · 0 评论 -
gcc 常用命令
gcc安装的各个部分: g++c++编译器,链接时使用c++库 gccc编译器,链接时使用c库 cc1实际的c编译器 cc1plus实际的c++编译器 collect2使用coll转载 2017-06-13 22:21:45 · 381 阅读 · 0 评论 -
Linux下的lds链接脚本详解
http://www.cnblogs.com/li-hao/p/4107964.html一、 概论每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情.连接器有个默认的内置连接脚本, 可用ld –转载 2017-06-13 22:42:05 · 1044 阅读 · 0 评论 -
LD 链接 文件 *.o文件 与*.so文件 的区别
原创 2017-06-14 20:59:32 · 1563 阅读 · 0 评论 -
pkg-config命令了解和使用
1.首先,什么是pkg-config:pkg-config 当你从源代码编译软件时,用来提供依赖库的信息的软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X和Solaris上都有着可用的版本。它输出已安装的库的各个信息,包括:1)C或C++编译器需要的参数2)链接器需要的参数3)已安装软件包的版本信息2.转载 2017-06-22 21:11:35 · 1604 阅读 · 0 评论 -
gcc 动态编译 与静态编译
对静态编译的程序而言,.o文件中的符号表一是要对外宣称自己定义了哪些符号,二是向外宣布自己引用了哪些符号,需要其他模块来支持。有了这些信息,static linker才能整合各个relocatable object file中的资源,互通有无,最后融合成一个静态的可执行程序。因此,实际上,对于静态的可执行程序,在加载执行的时候,其符号表已经没有任何意义了(可以方便debug转载 2017-06-22 12:03:14 · 2286 阅读 · 0 评论 -
Linux obj 定义描述
Ndx定义了和该符号相关的section indexbind域说明了该符号的可见性和行为:GLOBAL表示可以对所有的.o文件可见,LOCAL表示对其他的.o文件不可见(对c程序员而言就是static修饰符,由于是local的,因此用static修饰的变量可以重名)。WEAK,表示该符号是一个weak symbol。weak symbol的含义和global symbol含义是转载 2017-06-22 11:40:02 · 921 阅读 · 0 评论 -
符号表
符号定义的实质是:指分配了存储空间。函数名指明代码所在区域,变量名指数据所在区域所有符号的值就是其目标所在的首地址。符号解析也叫符号绑定。函数名和已初始化的全局变量名都是强符号。未初始化的全局变量名是弱符号•尽量避免使用全局变量••一定需要用的话,就按以下规则使用–尽量使用本地变量(static)–全局变量要赋初值–外部全局变量要使用ex原创 2017-06-21 20:08:57 · 3925 阅读 · 0 评论 -
链接重定位
符号解析完成后,可进行重定位工作,分三步1:合并相同的节–将集合E的所有目标模块中相同的节合并成新节 例如,所有.text节合并作为可执行文件中的.text节2:对定义符号进行重定位(确定地址)–确定新节中所有定义符号在虚拟地址空间中的地址 例如,为函数确定首地址,进而确定每条指令的地址,为变量确定首地址–完成这一步后,每条指令和每个全局变量都可确定地址3:对转载 2017-06-21 20:48:25 · 503 阅读 · 0 评论 -
可执行文件的加载
转载 2017-06-21 21:29:50 · 487 阅读 · 0 评论 -
延迟绑定
(gdb) x/w 0x8049578 0x8049578 : 0x080482c2 从上面可以看出,这个地址就是GOT表中的一项。它里面的内容是0x80482c2,即puts@plt中的第二条指令。前面我们不是提到过,GOT中这里本应该是puts函数的地址才对,那为什么会这样呢?原来链接器在把所需要的共享库加载进内存后,并没有把共享库中的函数的地址写到转载 2017-06-21 22:32:11 · 331 阅读 · 0 评论 -
动态重定位执行过程
ld-linux.so.2的_dl_runtime_resolve函数,这个函数解析出puts的绝对地址,回填到GOT[5]。所有动态库函数在第一次调用时,都是通过XXX@plt -> 公共@plt -> _dl_runtime_resolve调用关系做地址解析和重定位的。动态重定位执行过程linux 动态链接器提供动态重位功能,所有外部函数只有调用时才做重定位转载 2017-06-21 23:10:01 · 3802 阅读 · 0 评论 -
_dl_runtime_resolve
_dl_runtime_resolve是怎么知要查找printf函数的_dl_runtime_resolve找到printf函数地址之后,它怎么知道回填到哪个GOT表项到底_dl_runtime_resolve是什么时候被写到GOT表的前2个问题,只需要一个信息就可以了知道,这个信息就在藏在在函数对应的xxx@plt表中,以foo@plt为例:0000000000400590 :转载 2017-06-21 23:20:26 · 2166 阅读 · 0 评论 -
GOT与PLT
Global Offset Table(GOT) 在位置无关代码中,一般不能包含绝对虚拟地址(如共享库)。当在程序中引用某个共享库中的符号时,编译链接阶段并不知道这个符号的具体位置,只有等到动态链接器将所需要的共享库加载时进内存后,也就是在运行阶段,符号的地址才会最终确定。因此,需要有一个数据结构来保存符号的绝对地址,这就是GOT表的作用,GOT表中每项保存程序中引用其它符号的转载 2017-06-21 22:29:36 · 2726 阅读 · 0 评论 -
gcc 链接合并过程
E 将被合并以组成可执行文件的所有目标文件集合U 当前所有未解析的引用符号的集合D 当前所有定义符号的集合/* my.lib */ #include void foo() { printf("%s","I am from mylib!\n"); } /* main.obj*/*/ void foo(); int mai转载 2017-06-22 10:14:03 · 764 阅读 · 0 评论 -
Linux 运行时 寻找动态库过程
1:通过命令 LDD XXX 可以得到程序运行时依赖的动态库2:通过系统调用函数 execve,执行该程序,3:用 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 动态链接库 链接需要的动态库4:在默认路径下寻找 路径+依赖库名称5:在open("/etc/ld.so.cache)中寻找 open("原创 2017-06-14 21:22:30 · 593 阅读 · 0 评论 -
pkg-config --libs --cflags
不加pkg-config 前后的差距原创 2017-06-27 21:04:24 · 806 阅读 · 0 评论 -
g++ 64位版
g++ -m6432位版:加上 -m32 参数,生成32位的代码。64位版:加上 -m64 参数,生成64位的代码。原创 2017-07-20 23:26:02 · 4276 阅读 · 1 评论 -
查看ELF 文件版本信息
原创 2017-10-22 15:49:09 · 2046 阅读 · 0 评论 -
SO version
Running new applications on old glibcGlibc (short for GNU Libc, or GNU C Library) is a library that provides the interface between application programs and the Linux kernel. Although its officia转载 2017-10-22 19:14:54 · 857 阅读 · 0 评论 -
symbol-versioning
Ulrich Drepperdrepper@redhat.comELF Symbol VersioningThe symbol versioning implementation used on Linux with glibc 2.1 orup is an extension of Sun's versioning. It provides most of thefunctio转载 2017-10-22 19:20:21 · 681 阅读 · 0 评论 -
动态链接执行过程
原创 2017-10-24 17:10:08 · 412 阅读 · 0 评论 -
opencv ldd not found opencv***lib
原创 2017-11-19 14:53:03 · 505 阅读 · 0 评论 -
opencv was not found in the pkg-config search path
原创 2017-11-20 22:32:08 · 11686 阅读 · 0 评论 -
liblog4cpp.so: undefined reference to `pthread_key_create'
原创 2017-12-21 11:12:58 · 1274 阅读 · 0 评论 -
/usr/bin/ld: cannot find -luuid
原创 2017-12-13 16:50:11 · 392 阅读 · 0 评论 -
objdump -p 查看库文件版本信息
原创 2017-10-22 15:37:17 · 2100 阅读 · 0 评论 -
编译mariadbconn-c-src
原创 2017-11-06 21:10:54 · 393 阅读 · 0 评论 -
cppsql.cpp:2:19: fatal error: mysql.h: No such file or directory
原创 2017-10-18 20:08:29 · 1521 阅读 · 0 评论 -
查看本机是64位还是32位
#include using namespace std;int main(){cout<<sizeof(int*)*8<<endl;}原创 2017-07-20 23:28:39 · 990 阅读 · 0 评论 -
so文件依赖和提供符号 查看
readelf -r 是so档依赖的符号-r --relocs 显示可重定位段的信息。 1:rela.dyn:是对数据引用的修正,它所修正的位置位于.got及数据段。2:rela.plt :是对函数引用的修正;它所修正的位置位于 .got.plt重定位入口类型:R_X86_64_JUMP_SLO:是对.got.plt 的修正R_X86_64_GLOB_DAT:是对.got原创 2017-07-30 16:12:50 · 5768 阅读 · 0 评论 -
.bss section 与common section
大家都知道未初始化的global变量会被配置在.bss section中。不过在ELF中没有这么简单,ELF多了一个COMMON section专门用来存放未初始化的global变量。怎么会有两个地方都用来存放未初始化的global变量呢?其实是有差别的,以下我们举个例子来说明:int a = 1; //.data section int b = 0; //.bss section转载 2017-07-21 14:52:53 · 2531 阅读 · 0 评论 -
readelf –sD
.dynsym段,动态符号表段。可以通过readelf –sD *.so来查看如何确定所需要的加载库、如何解析符号、重名的文件如何处理。原创 2017-07-22 22:39:44 · 323 阅读 · 0 评论 -
ld 运行时动态链接
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2运行时 寻找动态链接的.interp段,设置动态链接器路径-dynamic-linker /lib/ld-linux.so.2指定动态装载器/链接器,即程序中的INTERP段中的内容。动态装载器/连接器负责连接有可共享库的可执行文件的装载和动态符号连接。原创 2017-07-22 22:27:10 · 1494 阅读 · 0 评论 -
gcc -fPIC 选项
分法转载 2017-07-19 21:33:26 · 7502 阅读 · 0 评论