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) Docker究竟如何使用Union File系统(如AUFS)来创建容器?如果Docker必须使用常规文件系统而不是联合文件系统,那么缺点是什么?
我正在寻找具体的技术细节/内部而不是高级答案.
在运行Linux 2.6.35+的系统中,我的程序会创建许多子进程并监视它们.如果子进程死亡,我会进行一些清理并再次生成进程.我用来在我的过程中signalfd()获取SIGCHLD信号.signalfd使用异步使用libevent.
当将信号处理程序用于非实时信号时,当信号处理程序针对特定信号运行时,必须阻止进一步发生相同的信号以避免进入递归处理程序.如果此时多个信号到达,则内核仅调用一次处理程序(当信号被解除阻塞时).
使用时也是同样的行为signalfd()吗?由于signalfd基本处理没有与正常信号处理程序的异步执行相关的典型问题,我认为内核可以排队所有进一步的事件SIGCHLD?
任何人都可以澄清这种情况下的Linux行为......
请参阅下面的简单示例.当一个函数返回一个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) 我有一个使用一堆.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的同步原语(自旋锁,互斥锁,RCU)使用内存屏障指令强制重新排序内存访问指令.这种重新排序可以由CPU本身或编译器完成.
有人可以展示一些GCC生成的代码示例吗?我主要对x86感兴趣.我之所以问这个问题,是为了理解GCC如何决定可以重新排序的指令.不同的x86 mirco架构(例如:沙桥与常春藤桥)使用不同的缓存架构.因此,我想知道GCC如何进行有效的重新排序,无论缓存架构如何,都有助于执行性能.一些示例C代码和重新排序的GCC生成的代码将非常有用.谢谢!
在支持时间戳计数器(TSC)的处理器中,Linux使用TSC提供高分辨率计时器选项.根据我的理解,TSC是一个可以读取的寄存器,但不提供以配置的速率中断CPU的选项.因此,对于Linux中的定时器中断生成仍然必须依赖I/O APIC(在x86上),HZ值通常设置为1000或250.
即使TSC以微秒粒度给出时间戳,定时器/调度粒度仍将是4ms或1ms,具体取决于HZ值.这种理解是否正确?或者是否可以使用TSC改进计时器粒度?
在我的共享库中,我必须在加载时进行某些初始化.如果我使用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(),则可行.
给定n个节点,如果每个节点连接到每个其他节点(除了它自己),则连接数将为n*(n-1)/ 2
如何证明这一点?
这不是一个家庭作业问题.我已经远离CS教科书,并且忘记了如何证明这一点的理论.
如果我将套接字绑定到INADDR_ANY,我知道它将接受服务器上配置的任何IP上的传入连接.假设我在进行bind()调用时配置了1个IP,然后配置了新的IP.将bind()接受发起到新配置的IP的连接,还是仅对调用bind()时存在的IP有效?