c语言 - 交叉编译 Arch arm 不会生成功能可执行文件



我将 Arch Arm 安装到 Rpi3 上,然后将 sysroot 与安装在联想 thinkpad 上的 x86_64 Arch Linux 同步。

然后我安装了arm-linux-gnueabihf Linaro交叉编译器

为了避免任何问题,我在编译中使用了绝对路径:

/home/sameh/Rpi/Compiler/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
--sysroot=/home/sameh/Rpi/Arch/ArmV7/root
-o stress stress.c -lm

代码编译良好,但是当我在 Rpi3 上执行它时,它没有输出。

它不会冻结 Pi,我可以ps aux并查看fork()创建的子进程。

但是不会打印任何调试语句,也不会退出任何进程。

编辑

此代码基于压力库。 对于MCVE,我将其最小化为仅hogcpu功能

#include <ctype.h>
#include <errno.h>
#include <libgen.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <sys/wait.h>
int hogcpu (void);
int
hogcpu (void)
{
for(int i=0; i < 1000000; i++)
sqrt (rand ());
return 0;
}
int main()
{
struct timespec start, end;
double cpu_time_used;
int pid, children = 0, retval = 0;
long forks;
int do_dryrun = 0;
long long do_backoff = 3000;
long long do_cpu = 1;
long long backoff, timeout = 0;
/* Calculate the backoff value so we get good fork throughput.  */
backoff = do_backoff * forks;
clock_gettime(CLOCK_REALTIME, &start); 
while ((forks = (do_cpu + do_io + do_vm + do_hdd)))
{
if (do_cpu)
{
switch (pid = fork ())
{
case 0:            /* child */
alarm (timeout);
usleep (backoff);
exit (hogcpu ());
case -1:           /* error */
break;
default:
++children;
}
--do_cpu;
}
}
/* Wait for our children to exit.  */
while (children)
{
int status, ret;
if ((pid = wait (&status)) > 0)
{
--children;
if (WIFEXITED (status))
{
if ((ret = WEXITSTATUS (status)) == 0)
{
printf( "<-- worker %i returned normallyn", pid);
}
else
{
printf( "<-- worker %i returned error %in", pid, ret);
++retval;
printf( "now reaping child worker processesn");
if (signal (SIGUSR1, SIG_IGN) == SIG_ERR)
printf( "handler error: %sn", strerror (errno));
if (kill (-1 * getpid (), SIGUSR1) == -1)
printf( "kill error: %sn", strerror (errno));
}
}
}
}
clock_gettime(CLOCK_REALTIME, &end); 
cpu_time_used = (end.tv_nsec = start.tv_nsec) / 1000000000.0;
/* Print final status message.  */
if (retval)
{
printf( "failed run completed in %.2f sn", cpu_time_used);
}
else
{
printf( "successful run completed in -- %.2f sn", cpu_time_used);
}
exit (retval);
}

我可以通过以下方式在 Pi 上成功编译和执行它:

[alarm@control ~]$ gcc stress.c -o stress -lm
[alarm@control ~]$ ./stress 
<-- worker 16834 returned normally
<-- worker 16835 returned normally
<-- worker 16836 returned normally
successful run completed in -- 0.90 s

但是,当交叉编译并传输到 Pi 时,上述行为就是我所看到的。

注意

这很可能与clock_gettime通话有关。 当我将其替换为clock()函数调用时,我可以在笔记本电脑上编译并运行它,但使用gcc在 Pi 上编译具有与上述相同的行为。

使用clock_gettime并在 Pi 上编译时,它工作正常。

这里的问题是long forks;变量是如何初始化的。我不精通编译器,但由于forks未初始化,计算backoff = do_backoff * forks;导致随机负数。

这会阻止呼叫usleep (backoff);完成。 因此,将forks初始化为 1 解决了问题。

我本以为forks应该被编译器初始化为0bss_data的过去,所以我不确定为什么没有。 可能需要对该部分进行更多研究,但是代码现在可以通过交叉编译很好地执行。

相关内容

  • 没有找到相关文章

最新更新