- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 linux 中创建一个共享库,但在尝试编译时出现以下错误:
relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
如果我删除 GetCrc16 的内容,它会起作用。我做错了什么?
/*
* main.c
*
* Created on: Jul 3, 2012
* Author: opc0de
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <mysql/mysql.h>
#include <arpa/inet.h>
#include <curl/curl.h>
typedef struct param
{
int * csock;
char * IMEI;
}param;
#define DAEMON_NAME "MEGA_TRACKER"
static const unsigned short crctab16[] =
{
0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF,
0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7,
0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E,
0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876,
0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD,
0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5,
0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C,
0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974,
0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB,
0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3,
0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A,
0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72,
0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9,
0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1,
0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738,
0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70,
0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7,
0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF,
0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036,
0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E,
0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5,
0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD,
0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134,
0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C,
0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3,
0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB,
0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232,
0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A,
0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1,
0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9,
0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330,
0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78,
};
unsigned char response[] = { 0x78, 0x78, 0x05 , 0x00 ,0x00, 0x00, 0x00, 0x00,0x0D, 0x0A};
char Hexars[] = {'0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'a', 'b','c', 'd', 'e', 'f' };
unsigned short GetCrc16(const unsigned char* pData, int nLength)
{
unsigned short fcs = 0xffff; // initialize
while(nLength>0){
fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];
nLength--;
pData++;
}
return ~fcs;
}
最佳答案
-fPIC 指示编译器将您的代码编译为与位置无关的代码。这是必需的,以便无论绝对地址如何都能正确执行机器代码。
这些主要用于共享库,因为相同的库代码可以加载到每个程序地址空间中的某个位置,不会与其他内存使用等重叠。
以下链接可以提供更多信息。
维基百科:http://en.wikipedia.org/wiki/Position_independent_code
所以:Why isn't all code compiled position independent?
关于c - 编译共享库时 -fPIC 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309404/
使用 Qt 时,CMake 会自动将 -fPIC 标志添加到编译选项。我想使用 -fpic,所以我检查了所有 Cmake 变量并将 -fPIC 替换为 -fpic。 cmake_minimum_req
环境:Ubuntu 16.04 在我的实验中,我运行了以下命令: gcc -c 1.c gcc -c -fPIC 2.c gcc -shared 1.o 2.o -o libmyxxx.so 我需要公
我已经阅读了 gcc 手册页,但我仍然无法理解 -fpic 和 -fPIC 之间的区别。有人可以用非常简单明了的方式解释一下吗? 相关问题: What does -fPIC mean when bui
海湾合作委员会错误: relocation R_X86_64_32S against `ebx' can not be used when making a shared object; recomp
我已经下载了一些我想从源代码编译的 C++。从命令行运行 cmake ../src 和 make 后,在构建目录中,出现以下错误: /usr/bin/ld: /usr/local/lib/libBul
我在 Google 上找不到直接的答案,而且由于我已经很长时间没有在 Linux 上做过任何事情,所以希望能在这里找到帮助。构建共享对象时,我在 Ubuntu 上遇到链接错误。链接器告诉我应该使用 -
我目前正在 cmake 环境中构建共享库 (lib1.so)。lib1.so 依赖于外部静态库 libLASlib.a(如有必要,我可以重新编译)。到目前为止,一切都在 Windows 上运行良好,但
我的应用程序需要在运行时加载一个或多个算法,为此我使用 .so。问题是这些库除了我的应用程序之外没有被任何其他进程使用,所以不需要与其他人共享 .text 部分。 .so 的某些部分来 self 预先
我正在尝试使用 luarocks 安装 numlua: luarocks make numlua-0.3-1.rockspec 但出现以下错误: /usr/bin/ld: numlua.o: relo
即使我可能不打算将生成的可重定位目标文件链接到共享库中,始终使用 -fPIC 进行编译是否有任何危害? 最佳答案 好吧,总是使用 -fPIC 进行编译会产生更臃肿和更慢的代码。 差异在 x64 目标上
我想检查共享库是否使用 -fPIC 标志编译。有哪些可能的方法(在 Linux 上,x86_64)检查这个? -fPIC 是否隐含(从而使检查变得多余?) 最佳答案 是的,GCC 不允许您在没有 -f
我知道 -fPIC 是共享库所必需的,并且知道为什么。 但是,我对这个问题不是很清楚: -fPIC 不应在构建可执行文件或静态库期间使用吗? 最佳答案 Should -fPIC never be us
我有 MPICH 3.0.4安装在我的机器上(Ubuntu 12.04)。我正在尝试安装一个名为 Qthreads 的库我之前使用过并成功安装过它(除了安装了 MPICH2 包)。配置工作正常: ./
我正在构建一个共享库。我只需要一个函数就可以公开。 共享库由几个目标文件和几个静态库构建而成。链接器提示一切都应该用 -fPIC 构建.所有目标文件和大多数静态库都是在没有这个选项的情况下构建的。 这
-fpic 标志有什么作用? 我想安装一个库( OpenSFM ),据说它需要使用 -fPIC 编译标志构建和安装 Ceres Solver。 问题是我已经安装了没有 -fPIC 标志的 Ceres
我想将目标文件和静态库组合成一个共享库,但是静态库不能暴露,它只在进入共享库的目标文件中引用。我认为在这种情况下,我不需要使用 -fPIC 编译静态库,但我不知道如何告诉链接器我不会使用静态库中的符号
今天,当尝试使用 mongodb c++ 客户端构建我的 so lib 项目时,出现错误: /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../.
我正在为一个类编写一些 C 代码,但我遇到了需要在 make 文件中完成的编译器问题,当它运行时它总是给出错误 usr/bin/ld: main.o: 重定位 R_X86_64_32S 对符号“被积函
在centos中./configure asterisk后我输入make命令但是出现了以下错误 /usr/bin/ld:/usr/local/lib/liblua.a(lapi.o): 创建共享对象时
我正在尝试在 linux 中创建一个共享库,但在尝试编译时出现以下错误: relocation R_X86_64_32S against `.rodata' can not be used when
我是一名优秀的程序员,十分优秀!