在3238嵌入式Linux(ARMLinux)的C代码中处理时间的正确方法是什么,以确保代码在2038年1月19日03:14:07 UTC之后继续正常工作(当有符号的32位time_t溢出时)?鉴于time_t在我必须使用的系统上签名32位,有哪些替代方案?
大量的谷歌搜索没有发现任何实际用途.每个人似乎都认为到那时我们都将使用64位操作系统,但这显然不适用于嵌入式系统.
在我需要使用的系统上,__kernel_time_t定义为a long.这可能意味着64位时间没有内核工具.uClibc的版本是0.9.29.
我不敢相信我是唯一有这个问题的人,我不想重新发明轮子.
我们在ARM 9上运行uclibc linux.问题是uclibc不支持回溯.当核心转储发生时,我无法获取调用堆栈.
有人有一个很好的解决方案吗?
例如,现有的uclibc回溯移植,或者在发生核心转储时获取调用堆栈的任何好方法(uclibc + ARM + Linux)?
我的最终目标是为我的旧Actiontec调制解调器/路由器编译无线工具,以便将其配置为无线到以太网桥.目前它的无线功能(看似)由管理大部分Web界面的相同二进制文件控制,但看起来他们使用库无线工具在内部使用至少一些功能.
我以前从未为不同的CPU架构交叉编译,也不确定如何完全识别我需要做的事情.我正在尝试使用uClibc,因为它似乎在系统的其余部分使用,但我不知道如何为调制解调器环境配置buildroot.我根据来自下面的proc的信息最好地猜测了配置应该是什么,但有些错误,因为一个简单的C应用程序只返回0编译后它无法正常运行.
# cat /proc/version
Linux version 2.4.17_mvl21-malta-mips_fp_le (root@localhost.localdomain) (gcc version 2.95.3 20010315 (release/MontaVista)) #1 Thu Apr 21 18:04:37 PDT 2005
# cat /proc/cpuinfo
processor : 0
cpu model : MIPS 4KEc V4.8
BogoMIPS : 149.91
wait instruction : no
microsecond timers : yes
extra interrupt vector : yes
hardware watchpoint : yes
VCED exceptions : not available
VCEI exceptions : not available
Run Code Online (Sandbox Code Playgroud) 我正在使用Debian/MIPS + QEMU来构建PortFusion的MIPS端口(TCP隧道解决方案).生成的二进制文件与GNU libc链接.因此,它们不能仅仅复制并用于带有uclibc而不是eglibc(看起来与GNU libc二进制兼容)的vanilla OpenWrt .
有没有办法将Debian/MIPS上的Haskell/GHC二进制文件与uclibc而不是eglibc链接?
OpenWrt使用uclibc是否真的是为什么从Debian复制的PortFusion二进制文件无法运行的原因,-ash: binary not found或者这条消息可能是由于其他原因造成的?
有关使用Linux内核和CPU仿真的详细信息,请参阅https://github.com/corsis/PortFusion/wiki/MIPS-Buildshaskell-platform.
make当我尝试构建使用eglibc的自定义OpenWrt映像时,OpenWrt的GIT存储库的当前负责人失败了.
这是一个已经存在的,以前的后期关闭,移动到服务器并再次关闭.我认为这篇文章是一个有效的stackoverflow问题,因为我认为它是由一些automake /编译/链接错误引起的.这是编程问题,而不是服务器管理问题.
https://serverfault.com/questions/418521/cross-compile-php
开始发布
我已经下载了PHP 5.4.0源代码,将其解压缩并移动到源文件夹中.
我做配置:
./configure --build=x86_64-unknown-linux-gnu --host=arm-linux-uclibcgnueabi --prefix=/usr/arm/www CC="arm-linux-uclibcgnueabi-gcc --sysroot=/toolchains/gnu_cortex-a9_tools/" --disable-libxml --disable-dom --without-iconv --without-openssl --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear --without-sqlite3 --disable-pdo --without-pdo-sqlite --disable-phar --with-config-file-path=/etc/
Run Code Online (Sandbox Code Playgroud)
其次是
make
Run Code Online (Sandbox Code Playgroud)
没有错误,一切都运行良好.接下来我做一个make install.
make install
Run Code Online (Sandbox Code Playgroud)
一切都运行良好.我将它移动到目标平台并运行
/usr/arm/www/bin/php -v
PHP 5.4.0 (cli) (built: Aug 15 2012 16:07:41)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
Run Code Online (Sandbox Code Playgroud)
我用我的网络服务器和php直接测试一个简单的主页.
<?php echo "hello" ?>
# php index.php
hello
Run Code Online (Sandbox Code Playgroud)
它按预期工作.接下来我测试:
<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>
Run Code Online (Sandbox Code Playgroud)
哦,不!
# …Run Code Online (Sandbox Code Playgroud) 有没有人有运行在基于uclibc的系统上使用boost库的C++应用程序的经验?它甚至可能吗?你会使用哪个C++标准库?uclibc ++可以与boost一起使用吗?
我试图测试某些功能fenv.h,但是,当我编译如下功能LD失败,undefined reference to 'feclearexcept'和undefined reference to 'fetestexcept'。我正在运行针对 uclibc 编译的强化 gentoo,我怀疑这至少在某种程度上是相关的
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <fenv.h>
#pragma STDC FENV_ACCESS on
int main ()
{
feclearexcept (FE_ALL_EXCEPT);
sqrt(-1);
if (fetestexcept(FE_INVALID)) printf ("sqrt(-1) raises FE_INVALID\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
fenv.h在/usr/include. 中有静态和动态库 ( libm.a, libm.so) /usr/lib。我正在编译gcc -o test test.c -lm;有没有人知道为什么链接器找不到相关函数。似乎没有fenv.h相应的库。
更新:这篇十年前的博文似乎暗示 uclibc 不支持 fenv。我无法确定是否仍然是这种情况,但如果是这样,有什么可以做的。 http://uclibc.10924.n7.nabble.com/missing-fenv-h-for-qemu-td2703.html
我有一个使用CMake构建的C / C ++项目。在尝试编译静态二进制文件时,我GLIBC在计算机和目标计算机上遇到了不同版本的问题。在关于SO的另一个问题中,对类似问题的公认答案是使用libc的替代实现,例如musl或uClibc。(请参阅此处)
我找不到有关如何指向cmake使用此类替代libc的任何信息。FindMusl.cmake文件既没有寄出,也无法在互联网上找到。简单使用CC=/usr/bin/musl-gcc是行不通的。
如何将我的cmake项目与此类替代libc实现静态链接,使其独立于GLIBC?
我想首先在我的电脑上测试 mcheck 功能以检测 malloc 合并错误。这样,我确信这将有助于解决嵌入式 Linux 机器上的类似崩溃问题。不幸的是,崩溃至少需要 3-4 天。因此,我正在寻找一个示例程序,该程序将生成类似的崩溃,如下所示。
Program terminated with signal 6, Aborted.
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
15 static inline _syscall2(int, __syscall_kill, __kernel_pid_t, pid,
int, sig);
Current language: auto; currently c
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
__res = 716485696
__err = 16
#1 0x2c73eb5c in kill (pid=900, sig=6) at kill.c:19
No locals.
#2 0x2aafb2e0 in pthread_kill (thread=900, signo=6) at signals.c:73
handle = (pthread_handle) 0x2ab3f2e0
pid = 900
#3 0x2aafbbb8 in raise …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚为什么 GCC 生成的二进制文件如此之大。
考虑这个空程序:
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我使用GCC 9.2.1 20190827 (Red Hat 9.2.1-1)和glibc 2.29构建它,没有任何附加参数:
gcc -o test test.c
生成的二进制文件为 21984 字节 (~22 KB)。查看使用 生成的文件xxd,在多个地方有大量的空字节:
00000370: 006c 6962 632e 736f 2e36 005f 5f6c 6962 .libc.so.6.__lib
00000380: 635f 7374 6172 745f 6d61 696e 0047 4c49 c_start_main.GLI
00000390: 4243 5f32 2e32 2e35 005f 5f67 6d6f 6e5f BC_2.2.5.__gmon_
000003a0: 7374 6172 745f 5f00 0000 0200 0000 0000 start__.........
000003b0: 0100 0100 0100 0000 1000 0000 …Run Code Online (Sandbox Code Playgroud)