小编Man*_*har的帖子

gcc调试符号(-g标志)vs链接器的-rdynamic选项

glibc提供backtrace()backtrace_symbols()获取正在运行的程序的堆栈跟踪.但为了实现这一点,程序必须使用链接器的-rdynamic标志构建.

-g传递给gcc和链接器-rdynamic标志的标志有什么区别?对于示例代码,我做了readelf来比较输出.-rdynamic似乎产生了更多的信息Symbol table '.dynsym'但我不太清楚附加信息是什么.

即使我strip使用的二进制程序-rdynamic,backtrace_symbols()继续工作.

strip去除它为什么留下任何被加入该二进制所有符号-rdynamic标志?

编辑:基于Mat的回复的后续问题如下..

对于相同的示例代码,您使用的是我看到的差异-g&-rdynamic

没有任何选择..

    Symbol table '.dynsym' contains 4 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
         1: 0000000000000000   218 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
         2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
         3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND …
Run Code Online (Sandbox Code Playgroud)

c linux linker gcc shared-libraries

30
推荐指数
1
解决办法
2万
查看次数

为什么Docker需要一个联盟文件系统

Docker究竟如何使用Union File系统(如AUFS)来创建容器?如果Docker必须使用常规文件系统而不是联合文件系统,那么缺点是什么?

我正在寻找具体的技术细节/内部而不是高级答案.

filesystems containers docker

25
推荐指数
1
解决办法
1万
查看次数

处理多个SIGCHLD

在运行Linux 2.6.35+的系统中,我的程序会创建许多子进程并监视它们.如果子进程死亡,我会进行一些清理并再次生成进程.我用来在我的过程中signalfd()获取SIGCHLD信号.signalfd使用异步使用libevent.

当将信号处理程序用于非实时信号时,当信号处理程序针对特定信号运行时,必须阻止进一步发生相同的信号以避免进入递归处理程序.如果此时多个信号到达,则内核仅调用一次处理程序(当信号被解除阻塞时).

使用时也是同样的行为signalfd()吗?由于signalfd基本处理没有与正常信号处理程序的异步执行相关的典型问题,我认为内核可以排队所有进一步的事件SIGCHLD

任何人都可以澄清这种情况下的Linux行为......

linux signals linux-kernel

21
推荐指数
1
解决办法
1万
查看次数

枚举类型检查C/gcc

请参阅下面的简单示例.当一个函数返回一个enum被分配给一个不同的变量enum我甚至没有得到任何警告gcc -Wall -pedantic.为什么C编译器不能对enums 进行类型检查?还是gcc具体的?我现在无法访问任何其他编译器来试用它.

enum fruit {
APPLE,
ORANGE
};

enum color {
RED,
GREEN
};

static inline enum color get_color() {
    return RED;
}

int main() {
    enum fruit ftype;
    ftype = get_color();
}
Run Code Online (Sandbox Code Playgroud)

c enums gcc

18
推荐指数
2
解决办法
1万
查看次数

ldd不适用于动态链接的二进制文件

我有一个使用一堆.so文件的二进制文件.

bash-3.00$ file foo
foo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.21, dynamically linked (uses shared libs), not stripped
Run Code Online (Sandbox Code Playgroud)

但是如果我在这个文件上运行ldd,它就无法获取二进制文件所依赖的.so文件.

bash-3.00$ ldd foo
        not a dynamic executable
bash-3.00$
Run Code Online (Sandbox Code Playgroud)

readelf确实显示了二进制文件使用的共享库列表.

bash-3.00$ readelf -d  foo
Dynamic segment at offset 0x17c810 contains 70 entries:

  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,为什么ldd无法获取库依赖项?

linux linker shared-libraries elf

14
推荐指数
2
解决办法
2万
查看次数

GCC对读/写指令的重新排序

Linux的同步原语(自旋锁,互斥锁,RCU)使用内存屏障指令强制重新排序内存访问指令.这种重新排序可以由CPU本身或编译器完成.

有人可以展示一些GCC生成的代码示例吗?我主要对x86感兴趣.我之所以问这个问题,是为了理解GCC如何决定可以重新排序的指令.不同的x86 mirco架构(例如:沙桥与常春藤桥)使用不同的缓存架构.因此,我想知道GCC如何进行有效的重新排序,无论缓存架构如何,都有助于执行性能.一些示例C代码和重新排序的GCC生成的代码将非常有用.谢谢!

memory cpu gcc linux-kernel compiler-optimization

13
推荐指数
2
解决办法
5830
查看次数

使用TSC作为时钟源可以改善定时器和调度粒度吗?

在支持时间戳计数器(TSC)的处理器中,Linux使用TSC提供高分辨率计时器选项.根据我的理解,TSC是一个可以读取的寄存器,但不提供以配置的速率中断CPU的选项.因此,对于Linux中的定时器中断生成仍然必须依赖I/O APIC(在x86上),HZ值通常设置为1000或250.

即使TSC以微秒粒度给出时间戳,定时器/调度粒度仍将是4ms或1ms,具体取决于HZ值.这种理解是否正确?或者是否可以使用TSC改进计时器粒度?

linux operating-system timer linux-kernel

12
推荐指数
1
解决办法
5917
查看次数

共享库构造函数不工作

在我的共享库中,我必须在加载时进行某些初始化.如果我使用GCC属性定义函数__attribute__ ((constructor))它不起作用,即在加载链接我的共享库的程序时不会调用它.

如果我将函数名称更改为_init(),它可以工作.显然现在不推荐使用_init()_fini()功能.

知道为什么__attribute__ ((constructor)) 不行吗?这是Linux 2.6.9,gcc版本3.4.6

编辑:

例如,假设库代码如下:

#include <stdio.h>

int smlib_count;

void __attribute__ ((constructor)) setup(void) {
    smlib_count = 100;
    printf("smlib_count starting at %d\n", smlib_count);
}

void smlib_count_incr() {
    smlib_count++;
    smlib_count++;
}

int smlib_count_get() {
    return smlib_count;
}
Run Code Online (Sandbox Code Playgroud)

为了构建.so,我执行以下操作:

gcc -fPIC -c smlib.c
ld -shared -soname libsmlib.so.1 -o libsmlib.so.1.0 -lc smlib.o
ldconfig -v -n .
ln -sf libsmlib.so.1 libsmlib.so
Run Code Online (Sandbox Code Playgroud)

由于.so不在标准位置之一,我更新LD_LIBRARY_PATH并链接.so来自另一个程序.构造函数不会被调用.如果我将其更改为_init(),则可行.

c linux gcc shared-libraries

10
推荐指数
1
解决办法
9209
查看次数

如何证明n个节点之间的最大连接数是n*(n-1)/ 2

给定n个节点,如果每个节点连接到每个其他节点(除了它自己),则连接数将为n*(n-1)/ 2

如何证明这一点?

这不是一个家庭作业问题.我已经远离CS教科书,并且忘记了如何证明这一点的理论.

algorithm graph discrete-mathematics graph-algorithm

10
推荐指数
3
解决办法
2万
查看次数

与INADDR_ANY绑定

如果我将套接字绑定到INADDR_ANY,我知道它将接受服务器上配置的任何IP上的传入连接.假设我在进行bind()调用时配置了1个IP,然后配置了新的IP.将bind()接受发起到新配置的IP的连接,还是仅对调用bind()时存在的IP有效?

sockets linux bind

8
推荐指数
1
解决办法
4424
查看次数