这是对不同问题的跟进。
最初的问题还有其他问题,但我必须意识到主要问题(根据 CLang)是重新定义time为不同的符号,而只使用了很好的C++ 包含。
所以这是一个精简版:
#include<iostream>
using std::cout;
using std::endl;
class time
{
public:
int h, min, sec;
};
const int full = 60;
void canonify(time& pre) // Error here (line 14)
{
pre.min += pre.sec / full;
pre.h += pre.min / full;
pre.sec %= full;
pre.min %= full;
}
int main()
{
time a; // and here (line 23)
a.h = 3;
a.min = 128;
a.sec = 70;
canonify(a);
cout << …Run Code Online (Sandbox Code Playgroud) 假设我想完全接管open()系统调用,可能包装实际的系统调用并执行一些日志记录.一种方法是使用LD_PRELOAD加载(用户自制的)共享对象库,该库接管open()入口点.
然后,用户制作的开放()例程获得的指针的glibc函数open()由dlsym()荷兰国际集团它,并调用它.
然而,上面提出的解决方案是动态解决方案.假设我想open()静态链接我自己的包装器.我该怎么办?我猜机制是一样的,但我也猜测用户定义open()和libc 之间会有一个符号冲突open().
请分享任何其他技术以实现相同的目标.
有时我想在stdlib中查找函数的实现,我已经下载了源代码,但它非常混乱.
因为许多命中,因为greping并不适合.
有没有人知道具有文档的网页doxygen风格.
Linux内核也是如此.
谢谢
有数学运算产生+/-无穷大的实数.例如exp(-infinity) = 0.标准C库中是否存在接受IEEE-754无穷大的数学函数标准(不抛弃或返回NaN).我在Linux系统上,并且会对这样的列表感兴趣glibc.我在他们的在线手册中找不到这样的清单.例如,他们的文档exp没有提到它如何处理-infinity案件.任何帮助都感激不尽.
我的应用程序不使用NDK.我正在GenyMotion Nexus 7仿真器上测试它,问题很难再现,我仍然没有想出一个正确的方法来重现它.有时候应用程序可以正常运行很长时间,有时它会崩溃并在使用大约30秒后自动重启.
编辑:我不是100%,但它只发生在genymotion模拟器,但不是常规的Android模拟器(我会继续测试).
当我在横向模式下添加对大屏幕的支持时开始出现问题(开始在横向中一次显示两个片段,纵向仅显示1个片段(宽度小于720)).
其中一个片段延迟加载图像(来自内存,磁盘或互联网).
我对这种动态添加和删除片段很新,所以我确信那里可能有一些东西.
无论如何,请帮助我解码这个转储并找出导致崩溃的原因(我会尝试省略我觉得不重要的东西):
12-17 16:52:18.344 1255-1255/? A/libc? Fatal signal 11 (SIGSEGV) at 0x97858094 (code=2), thread 1255 (hiexpressgradle)
12-17 16:52:18.448 121-121/? I/DEBUG? *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
12-17 16:52:18.448 121-121/? I/DEBUG? Build fingerprint: 'generic/vbox86tp/vbox86tp:4.3/JLS36G/eng.buildbot.20131127.101043:userdebug/test-keys'
12-17 16:52:18.448 121-121/? I/DEBUG? Revision: '0'
12-17 16:52:18.448 121-121/? I/DEBUG? pid: 1255, tid: 1255, name: hiexpressgradle >>> XXX <<<
12-17 16:52:18.448 121-121/? I/DEBUG? signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr …Run Code Online (Sandbox Code Playgroud) 因此定义了execvp:
int execvp(const char *file, char *const argv[]);
Run Code Online (Sandbox Code Playgroud)
这使得这样的代码无法使用:
const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);
Run Code Online (Sandbox Code Playgroud)
这是意外遗漏吗?围绕这个const_cast是否安全?或者做一些execvp实现实际上是在那个内存上乱写?
我正在寻找一个用于嵌入式使用ARM7微控制器上的freertos的小型libc.我看过newlib,但它对我的需求来说太复杂了.Newlib在许多函数中调用malloc()(例如printf()),这对小型嵌入式实时系统不利.
有谁知道一个适合我的应用程序的小型,可移植,开源的libc实现?
我们有一个CFD求解器,在运行模拟时,发现它在某些机器上运行速度非常慢,而在其他机器上却运行得非常慢.使用英特尔VTune,发现以下行是问题(在Fortran中):
RHOV= RHO_INF*((1.0_wp - COEFF*EXP(F0)))**(1.0_wp/(GAMM - 1.0_wp))
Run Code Online (Sandbox Code Playgroud)
使用VTune进行钻取,问题可以追溯到call pow装配线,当跟踪堆栈时,它显示它正在使用__slowpow().经过一番搜索,这个页面出现了抱怨同样的事情.
在具有libc版本2.12的机器上,模拟花了18秒.在libc版本为2.14的机器上,模拟耗时0秒.
基于上述页面的信息,当基数pow()接近1.0 时出现问题.所以我们做了另一个简单的测试,我们在之前用任意数字缩放基数pow(),然后除以在pow()调用之后提升到指数的数字.使用libc 2.12时,运行时间从18秒减少到0秒.
但是,将这些全部放在我们所做的代码上是不切实际的a**b.如何更换pow()libc中的函数?例如,我希望call powFortran编译器生成的装配线调用pow()我们编写的自定义函数来执行缩放,调用libc pow()然后除以缩放.如何创建一个对编译器透明的中间层?
编辑
为了澄清,我们正在寻找类似(伪代码)的东西:
double pow(a,b) {
a *= 5.0
tmp = pow_from_libc(a,b)
return tmp/pow_from_libc(5.0, b)
}
Run Code Online (Sandbox Code Playgroud)
是否可以加载powlibc并在我们的自定义函数中重命名以避免命名冲突?如果customPow.o文件可以pow从libc 重命名,如果其他东西仍然需要libc会发生什么?这会导致libc pow中customPow.o和powlibc 之间的命名冲突吗?
abs(-2147483648)的结果是-2147483648,不是吗?这似乎是不可接受的.
printf("abs(-2147483648): %d\n", abs(-2147483648));
Run Code Online (Sandbox Code Playgroud)
输出:
abs(-2147483648): -2147483648
Run Code Online (Sandbox Code Playgroud) 为什么libc_nonshared.a存在?它的目的是什么?我一直无法在网上找到关于它存在的好答案。
据我可以告诉它提供了某些符号(stat,lstat,fstat,atexit,等等)。如果有人在他们的代码中使用这些函数之一,它将被链接到这个存档中的最终可执行文件。这些函数是 POSIX 标准的一部分并且非常常见,所以我不明白为什么它们不会分别放在 shared 或 staticlibc.so.6或 中libc.a。
libc ×10
c ×8
c++ ×2
android ×1
android-ndk ×1
embedded ×1
execvp ×1
fortran ×1
freertos ×1
genymotion ×1
glibc ×1
kernel ×1
linux ×1
pow ×1
system-calls ×1