当ld-linux解析符号时,它以特定顺序搜索共享库,并在找到具有匹配符号的共享库时停止.
是什么决定了它在图书馆中搜索的顺序?如果未解析的符号在主程序或另一个共享库中,它会有所不同吗?
如何在不调用ldd之类的外部程序的情况下以编程方式确定搜索顺序?
SUSv4未在其异步信号安全函数列表中列出 opendir、readdir、closedir 等。
有没有一种安全的方法从信号处理程序读取目录列表?
例如,是否可以“打开”目录并以某种方式取出原始目录列表?如果是这样,“read”返回什么样的数据结构?
或者也许在 Linux 上有某些系统调用是异步信号安全的,即使 SUSv4 / POSIX 不需要它可以使用?
检测32位用户模式程序是否在64位内核上运行(即系统是否处于"长模式")的最佳和最可靠的方法是什么?如果可能的话,我宁愿不调用外部程序(或者必须加载任何内核模块).
注意:我想检测是否正在使用64位内核(或者实际上,CPU是否处于长模式),而不仅仅是因为存在64位处理器(/proc/cpuinfo告诉我但不是64位)能力正在被使用).
如果uname编译为32位或者如果setarch i686使用,则内核伪造32位处理器.
什么是调试堆栈值损坏的好方法。在我的程序中,有时在返回对文件描述符进行关闭的方法后,此指针的地址会更改。我调试了几个小时的程序,但找不到问题。
找出改变此指针地址的有效方法是什么?当我在此指针上手动添加监视时,不会发生错误。当我尽可能减少代码时,仍然会发生错误。我尝试了Valgrind,但未发现任何早期堆栈损坏。
我设法检测到何时发生错误,我以64位模式编译了代码。此地址从0xxxxxxx更改为0x1000000xxxxxxx。我在发生错误的方法中检查了这个地址,发现了地址更改的时间(有关此信息,请参见第一个段落)。
还有其他方法可以找出造成此问题的原因吗?
GNU C++(g ++ -pedantic -Wall)接受这个:
typedef int MyInt;
class Test
{
public:
MyInt foo();
void bar(MyInt baz);
};
int Test::foo()
{
return 10;
}
void Test::bar(int baz)
{
}
int main(void)
{
Test t;
t.bar(t.foo());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它是合法的C++吗?其他编译器是否可能接受它?