Replies: 1 comment 1 reply
-
也遇到过这个问题,我的解决方案是给用户程序编译选项加上-no-pie和-fno-pie。当时也有点纳闷为什么生成的是ELF shared object而不是executable。我猜有可能现在链接中的musl gcc是默认开启生成PIE的,而原来的那个不是。 |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
问题
ucore ch5练习中,在usershell运行ch5_mergetest,会产生如下错误:
ch5_mergetest代码如下:
可以看到ch5_mergetest并未得到待测试程序的名称,因而打印出的目标测试程序名称均为
null
。通过测试发现数组TESTS和FAILES中的数据均为0,于是ch5_mergetest获得的程序名均为空指针,导致错误。
进一步实验发现,ucore用户态程序中包含常量字符串指针的变量,都无法正常初始化(其初始值始终为0),包括
char *[]
类型的全局常量字符串指针数组。char *
类型的全局常量字符串指针。char*[]
类型的常量字符串指针数组大小达到一定值时,也会无法初始化。环境
ucore实验指导中的工具链与qemu。
复现
修改Makefile,将ch5_mergetest添加到ch5的测试程序集(ch5原始Makefile好像并未包括该程序),并在usershell中执行ch5_mergetest;
或者在任一用户程序中创建全局变量
char * str = "waku";
,并在main函数中尝试打印。原因推测
链接器在链接ucore用户态程序时,会把TESTS和FAILS放到名为.data.rel.local的section中,初始化为0,且该段在链接器链接过程中中符号没有重定位。导致最终TESTS、FAILS等数组内容为空。(猜测可能是由于TESTS、FAILS等全局变量引用了常量字符串,被编译器优化为在 运行时 进行重定位,而ucore不提供运行时重定位功能,导致问题发生。
解决办法
在用户程序的链接选项中添加
-static
参数,可以避免这一问题。其他
通过测试发现:
欢迎大家交流讨论,比如也遇到过这个问题或者了解gcc相关文档。😁
Beta Was this translation helpful? Give feedback.
All reactions