linux在gcc编译时加上 -shared 参数时,目的是使源码编译成动态库 .so 文件: 而-fPIC的作用是 告知编译器 生成位置无关代码(编译产生的代码没有绝对位置,只有相对位置):从而可以在任意地方调用生成的动态库. 示例: gcc fun.c -shared - fPIC -o libfun.so 如果代码没有错误,则可以在当前路径下生成libfunc.so文件: 此时此动态库还不能被正确的链接上,因为系统寻找链接库的路径不包含当前路径:需要将此so文件放到搜寻路径中,或者添加寻找…
fPIC作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),   则产生的代码中,没有绝对地址,所有使用相对地址.故而代码能够被载入器载入到内存的随意   位置,都能够正确的运行.这正是共享库所要求的,共享库被载入时.在内存的位置不是固定的. gcc -shared -fPIC -o 1.so 1.c 这里有一个-fPIC參数 PIC就是position independent code PIC使.so文件的代码段变为真正意义上的共享 假设不加-f…
gcc -shared -o hack.so hack.c/usr/bin/ld: /tmp/ccUZREwA.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC/tmp/ccUZREwA.o: could not read symbols: Bad valuecollect2: ld returned 1 exit…
gcc编译参数-fPIC的一些问题 (2012-07-26 15:41:08) 转载▼ 标签: linux compiler gcc -fpic it 分类: NSN_BspDriver ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),  则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意  位置,都可以…
gcc -shared -fPIC -o 1.so 1.c   这里有一个-fPIC参数 PIC就是position independent code PIC使.so文件的代码段变为真正意义上的共享…
参考: 1.<3.18 Options for Code Generation Conventions>2.<Options for Linking>3.<GCC -fPIC option>4.<百度百科>5.<请问gcc里的参数-fPIC的一些问题> 3.18 Options for Code Generation Conventions ... -fpic Generate position-independent code (PIC) su…
介绍一个生成动态链接库*.so的例子: 首先新建1个头文件test.h: #include <stdio.h> void first(); void second(); void third(); 然后新建3个源文件first.c/second.c/third.c: first.c: #include "test.h" void first() { printf("this is first.\n"); } second.c: #include &quo…
1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++.java.Pascal等语言.gcc支持多种硬件平台. 2. gcc的特点 gcc是一个可移植的编译器,支持多种硬件平台.例如ARM.X86等等. gcc不仅是个本地编译器,它还能跨平台交叉编译.所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行.而gcc编译出来的程序能够在其…
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可执行程序…
1. 编译单个文件成可执行文件 gcc hello.c 生成默认的可执行文件a.out 2. 编译单个文件为指定名字的可执行文件,使用-o选项指定文件名字 gcc -o test main.c 生成文件名为test的可执行文件 3. 编译单个源文件成目标文件 (1)使用-c选项生成目标文件 gcc -c main.c 生成文件名为main.o的目标文件 (2)使用-o选项指定目标文件名字 gcc -c -o test.o main.c 生成文件名为test.o的目标文件 4. 同时编译多个源文件…