今天,我一直在努力设置额外的VPS克隆,并且使用最新的nginx开发版本(0.9.6),我遇到了一个奇怪而令人沮丧的编译时错误。 我运行Ubuntu 10.04.2 LTS x86_64,但是,我已经升级到4.6.1的GCC。 ./configure运行时没有错误,但运行make -j4时出现以下错误: gcc -c -pipe -O -W -Wall -Winterinter-arith -Wno -unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -I src / core -I src / event -I src / event / modules -I src / os / unix -I objs \ -o objs / src / core / ngx_open_file_cache.o \ src / […]
当我运行我写的程序时,我得到以下两个错误消息(它们的多个实例)。 程序很大,所以不能在这里显示。 无论如何,任何想法什么样的编程错误可以导致这些错误? 请注意,我在我的程序中同时使用了mmap和mprotect 。 Internal kernel structures could not be allocated. mprotect: Cannot allocate memory
我试图从一开始就从另一个进程中分离出一个进程。 为此,我试图修改glibc中的__libc_start_main函数(我使用了一个修改后的glibc),并试图将fork放在那里,但是无法编译glibc,因为每当我尝试这样做的时候都会报错。 什么是其他选项,为什么在__libc_start_main中插入fork不起作用? 再次注意到我想以一种不需要程序修改的方式来完成,那就是glibc中的修改是可以的,但不是程序。 在__libc_start_main ,我尝试像这样分叉。 if (__builtin_expect (! not_first_call, 1)) { struct pthread *self; fork(); // <– here self = THREAD_SELF; /* Store old info. */ unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf); unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup); /* Store the new cleanup handler info. */ THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf); /* Run the program. */ result […]
我正在尝试LD_PRELOAD函数,如mmap , read , open , clone等…,但是当某些函数成功获取LD_PRELOADed时,其他人则不会。 例如mmap , read和open完全被预加载,但clone不是,虽然我知道肯定clone被从我的程序调用strace报告,因为我使用pthreads。 这里clone不是LD_PRELOAD的原因是什么?
如果我编译下面的程序std = c99,我得到一个错误,但程序编译罚款没有c99标志。 为什么? #include <signal.h> void x() { sigset_t dd; } int main(void) { x(); return 0; } jim@cola temp]$ gcc -std=c99 blah.c -o blah blah.c: In function 'x': blah.c:9: error: 'sigset_t' undeclared (first use in this function) blah.c:9: error: (Each undeclared identifier is reported only once blah.c:9: error: for each function it appears […]
我正在尝试设置OpenSSL的补丁版本来使用DTLS,我遇到了很多麻烦。 我假设这是由于我不了解gcc和链接c库。 特别是,我不断看到人们说,链接到lib /子文件夹,但我找不到一个OpenSSL。 我也是一个关于构build32位OpenSSL的问题 ,但我正在尝试做64位。 OSX 获取源代码和补丁: wget ftp://ftp.openssl.org/source/openssl-1.0.1c.tar.gz # get latest stable OpenSSL mv ~/Downloads/openssl-1.0.1c.tar.gz /usr/local/openssl-1.0.1c.tar.gz cd /usr/local/openssl-1.0.1c.tar.gz wget http://sctp.fh-muenster.de/dtls/dtls-bugs-1.0.1.patch # get the patch file build设(64位,OpenSSL默认为32位): export CFLAGS="-arch x86_64" export LDFLAGS="-arch x86_64" ./Configure darwin64-x86_64-cc # 64 bit config command make # .a files should be built, great 太好了,我在OpenSSL根目录下有一些库: /usr/local/openssl-1.0.1c$ ll lib* -rw-r–r– 1 […]
您能否介绍一下,您是如何在32位debian机器上安装gcc-multilib和g ++ – multilib来生成64位代码的? 我在我的32位debian系统上安装了gcc-4.7.2(还安装了binutils-2.23)。 当我尝试用-m64标志编译一个简单的hello世界程序 # gcc -m64 hello.c 我收到以下错误消息: "hello.c:1:0: sorry, unimplemented: 64-bit mode not compiled in" . 请告诉我在32位debian系统上生成64位代码的步骤。
目前,我试图在集群系统中实现共享堆栈。 这个系统有两个地址空间,一个是私有的,在所有处理器之间共享。 我怎么能改变在C编程堆栈的开始和结束? 也就是说,我想把堆栈放在一个共享空间中,改变程序的stream程来使用它。
我正在写一些代码,为每个内存分配存储回溯。 然后,我将这些列表写入文件进行离线分析。 在win32中,我使用_AddressOfReturnAddress ,然后手动创build回溯。 由于每次运行的地址都是随机的,我使用GetModuleInformation和lpBaseOfDll来获取基地址。 这对x86很有用,没有FPO,这对我来说已经足够了。 然后使用win32 API加载PDB将地址转换为函数名称。 我将如何在Linux上做到这一点? 我目前的做法是使用__builtin_return_address(x)和addr2line离线得到相同的结果。 问题是每次运行的地址都是随机的,所以addr2line不理解它们。 __executable_start不起作用,因为它每次运行返回相同的值。 有没有办法在运行时获得我的可执行文件的基地址? 一次运行给了我这个: __executable_start: 0x8048000 backtrace: 0x9cce628 0x9cce2b8 0x9cce260 0x9cce1f8 0x9cce138 0x9cce0c8 0x9cce060 0x9cce008 而下一个: __executable_start: 0x8048000 backtrace: 0x8db6628 0x8db62b8 0x8db6260 0x8db61f8 0x8db6138 0x8db60c8 0x8db6060 0x8db6008 等等。
我的C ++应用程序依赖于GCC,MongoDB C ++驱动程序和Boost。 我目前的做法是保持操作系统的一致性。 我在Ubuntu 12.04 64位桌面上开发C ++,并将其部署到Ubuntu 12.04 64位服务器上。 另外,我应该在目标服务器上安装相同版本的依赖项。 但是,如果我想在Ubuntu 13.04上开发我的C ++应用程序,并使用最新的Boost,MongoDB驱动程序和GCC 4.8.1,可以很容易地在Ubuntu 12.04服务器上部署C ++应用程序。 静态链接 dynamic链接,还部署所有的依赖关系到目标服务器? 哪一种方法很简单? 有时,我无法在目标服务器上编译库。