运行Ubuntu 10.04
$ uname -a
Linux minion 2.6.32-36-generic-pae #79-Ubuntu SMP Tue Nov 8 23:25:26 UTC 2011 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
下载源并执行以下操作:
CFLAGS="-O2 -U_FORTIFY_SOURCE -fno-stack-protector" '/home/user/Desktop/eglibc-2.11.1/configure' --prefix='/home/user/Desktop/eglibc_pristinebuild'
make -j4
export LD_LIBRARY_PATH=/lib/tls/i686/cmov:/lib:/usr/lib
Run Code Online (Sandbox Code Playgroud)
这有效:
$ ./elf/ld-linux.so.2 /bin/ls /usr
bin games include lib lib64 local sbin share src
Run Code Online (Sandbox Code Playgroud)
这失败了:
$ ./elf/ld-linux.so.2 /bin/true
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
但这有效:
/lib/ld-linux.so.2 /bin/true
Run Code Online (Sandbox Code Playgroud)
False,grep和cat其他我/bin以同样的方式在segfault中尝试过的其他事情.源是否存在问题?我编译错了吗?
另外值得注意的是,我为raspberry pi(ARM)下载了正确的版本(略微更新),编译了它,并且它没有段错误.
我有一个C++库,可以生成更大的代码,我真的期望它正在做什么.从不到50K的源代码行中,我获得了大约4 MB的共享对象和静态归档推送9.这是有问题的,因为库二进制文件非常大,更糟糕的是,甚至连接它的简单应用程序通常会获得500到1000 KB代码大小.使用像-Os这样的标志编译库有点帮助,但不是很多.
我还尝试了GCC的-frepo命令(尽管我见过的所有文档都表明Linux上的collect2将会合并重复的模板)和模板上的显式模板实例化似乎"可能"重复很多,但是没有两种情况都有实际效果.当然,我说"可能",因为,与任何类型的剖析一样,这样的盲目猜测几乎总是错误的.
是否有一些工具可以轻松地分析代码大小,或者其他一些方法我可以找出占用这么多空间的东西,或者更一般地说,我应该尝试的其他任何东西?在Linux下工作的东西是理想的,但我将采取我能得到的东西.
这个非常简单的c程序在使用valgrind运行时会给我一个分段错误.它开始正常时运行良好.将USR1信号发送到进程时会崩溃.
问题似乎是printf处理浮点值格式化的方式,因为如果使用字符串(%s)或int(%d)格式参数,它可以正常工作.
PS我知道你不应该在信号处理程序中调用任何printf系列函数,但仍然为什么它只与valgrind崩溃.
#include <stdio.h>
#include <signal.h>
void sig_usr1(int sig) {
char buf[128];
snprintf(buf, sizeof(buf), "%f", 1.0);
}
int main(int argc, char **argv) {
(void) signal(SIGUSR1, sig_usr1);
while(1);
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种枚举所有ELF节及其当前二进制文件的地址以及当前进程可能已加载的所有共享对象的好方法。
我知道dl_iterate_phdr()的存在,这使我可以轻松使用ELF 段列表,但是我正在寻找ELF 节,所以这不是我的正确选择。
我不关心可移植性,只要它可在带有ELF的Linux上运行,我就很高兴!
任何提示表示赞赏!
我有一个需要在Windows,Linux和VxWorks上构建的项目.该项目建立在Linux和Windows上,但是为VxWorks交叉编译.要处理跨多个平台的字节序,它使用ntoh.h. Linux机器是小端,但是ntohl不会交换我的程序.
我写了一个直接包含in.h的测试程序.交换得恰到好处.我写了另一个包含ntoh.h的测试程序.交换得恰到好处.两个测试程序都链接到lib64/libc.so.6.
但是,当我编译我的项目时,ntohl不会交换.我无法使用gdb"break ntohl"命令打破ntohl.在构建时,我看到LITTLE ENDIAN警告(见下文)并且没有看到"SHOULDNT BE HERE"错误.
请帮忙.我不明白为什么会出现这个问题.
下面是ntoh.h:
#ifndef __ntoh__
#define __ntoh__
#include "basic_types.h"
#ifdef WIN32
#include <winsock2.h>
#elif LINUX
#include <netinet/in.h>
//This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
// Not in original code
#if __BYTE_ORDER == __BIG_ENDIAN
#warning BIG ENDIAN BYTE ORDER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#endif
//This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
// Not in original code
#if __BYTE_ORDER == __LITTLE_ENDIAN
#warning YAY LITTLE ENDIAN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! …Run Code Online (Sandbox Code Playgroud) 我正在尝试链接Andi Kleen的glibc实现,以便为使用pthreads的程序启用锁定省略.我将我的程序链接如下:
g++ \
-Wl,--rpath=/path/glibc-elision/build/lib \
-Wl,--dynamic-linker=/path/glibc-elision/build/lib/ld-linux-x86-64.so.2 \
-o program program.o \
-fgnu-tm -mrtm -pthread \
-Wl,--no-as-needed --enable-lock-elision=yes
Run Code Online (Sandbox Code Playgroud)
只要我不使用libstdc ++的任何组件,一切正常.
但是,尽管std::vector引用了eg ,动态链接器也找不到libstdc ++.so.6(error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory).
为解决此错误,我尝试提供自定义以及标准glibc -Wl,--rpath=/path/glibc-elision/build/lib;/usr/lib/x86_64-linux-gnu/libstdc++.so.6.这不是正确的调用,但想法是以某种方式提供两个库.
所以问题是:
如何将程序与两个glibcs的不同组件链接?
我正在使用gcc(Ubuntu/Linaro 4.8.1-10ubuntu8)4.8.1开发Ubuntu 13.10.
作为构建过程的一部分,我们在编译可执行文件时生成一个映射文件.例如:
g++ -Wl,-Map,/tmp/foo.map -o foo foo.cpp
Run Code Online (Sandbox Code Playgroud)
为了尝试从GCC 4.3/4.4迁移到GCC 4.9,我们设置了一个新的构建服务器.4.9构建服务器生成的映射文件没有损坏的符号名称.4.3/4.4构建服务器生成的映射文件.例如,运行上面的4.3我在地图文件中剪切了这个:
.plt 0x0000000000400700 0x90 /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crt1.o
0x0000000000400710 _ZNSolsEi@@GLIBCXX_3.4
0x0000000000400720 _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
0x0000000000400730 __libc_start_main@@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud)
针对4.9运行相同的代码我得到以下代码段:
.plt 0x00000000004006e0 0x80 /usr/lib/../lib64/crt1.o
0x00000000004006f0 std::ostream::operator<<(int)@@GLIBCXX_3.4
0x0000000000400700 std::ios_base::Init::Init()@@GLIBCXX_3.4
0x0000000000400710 __libc_start_main@@GLIBC_2.2.5
0x0000000000400720 __cxa_atexit@@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud)
这是预期的变化吗?有没有办法用gcc 4.9(某种向后兼容性选项)生成错位输出?我问,因为我们构建中的后续工具使用符号文件并且在解码的名称上窒息.
当您dlopen()是共享对象时,是否有一种机制可以让该 DLL 中的代码在不被显式调用的情况下执行?具体来说,调用者dlopen()可能不知道的全局变量/静态变量的 C++ 静态初始化代码?我很确定答案应该是“是”,但我不记得是什么机制导致这种情况发生,以及如何利用它来运行任意代码。
c++ shared-objects dynamic-loading dlopen static-initialization
代码(m1.cpp):
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
cout << "running m1" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GDB版本:GNU gdb(GDB)7.6.2
建造使用: g++ -g m1.cpp
命令行历史记录:
(gdb) b main
Breakpoint 1 at 0x40087b: file m1.cpp, line 6.
(gdb) r
Starting program: .../a.out
Program received signal SIGSEGV, Segmentation fault.
0x00002aaaaaac16a0 in strcmp () from /lib64/ld-linux-x86-64.so.2
(gdb) c
Continuing.
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb)
Run Code Online (Sandbox Code Playgroud)
当我在没有设置任何断点的情况下运行时,它运行没有错误.
按照要求:
(gdb) bt
#0 strcmp () …Run Code Online (Sandbox Code Playgroud) 我试图从 Linux 程序的 elf 文件中提取特定的字符串变量(即符号),甚至从它来自的 .o 中提取。它在 .rodata 部分,显然我知道符号名称。是否有一系列 objdump 样式的命令和选项可用于转储字符串?
更新:
例如,.map 文件包括:
.rodata.default_environment 0x000000001013f763 0x615 common/built-in.o
0x000000001013f763 default_environment
Run Code Online (Sandbox Code Playgroud)
变量本身 - default_environment- 是标准的以空字符结尾的文本字符串。