linux-c5

本文探讨了计算机内存的划分,包括静态数据区、代码区、栈区和堆区,并通过具体实例讲解了C语言中一维及二维数组的不同初始化方法。此外,还分析了一个用于提取连续数字字符的函数的潜在缺陷。

6 (A064) 计算机内存一般分为静态数据区、代码区、栈区和堆区,若某一指令的操作数之一采用立即数寻址方式,则该操作数位于()
A: 静态数据区
B: 代码区
C: 栈区
D: 堆区
7 (A029) 以下定义整型3行4列的二维数组a并初始化不正确的是()
A:int a[3][4]={0}
B:int a[][4]={0,1,2,3,4,5,6,7,8,9,10,11,12}
C:int a[3][]={0,1,2,3,4,5,6,7,8,9,10,11,12}
D:int a[3][4]={{1,2},{1,2,3},{1,2,3,4}}
8 (A040) 5. 下列函数功能是将pBuf中的连续数字拷贝到pData中生成一个新字符串,关于该函数述叙正确的是:(    )
void GetDigitString(char* pData, char* pBuf)
{
    char *pTmpData = pData, *pTmpBuf = pBuf;
    while (‘\0’ != (*pTmpBuf))
    {
        if ((‘0’ <= *pTmpBuf) && (‘9’ >= *pTmpBuf))
        {
            *pTmpData = *pTmpBuf;
            pTmpData++;
        }
        else
        {
            break;
        }
        pTmpBuf++;
    }
    return;
}
A:该函数是正确的
B:生成后的字符串没有在结尾加'\0'结束符,使用该字符串时会有未知的影响
C:对于数字的判断,不能简单的这样判断,而必须要比较它们的ASCII码
D:本函数会导致死循环
9 (A038) 下列程序在X86上的运行结果( )
struct mybitfields
{
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
}test

void main(void)
{
    int i;
    test.a=2;
    test.b=3;
    test.c=0;

    i=*((short *)&test);
    printf("%d\n",i);
}
A:32
B:45
C:50
D:70

<think> 我们面对的是一个链接错误,错误信息显示在链接过程中找不到`lib_tee_cli_read_protected_data`这个函数的定义。 错误发生在链接`libtpssl.a`库中的`sslApi.o`文件时,具体在`tpssl_pk_parse_keyfile`函数中调用了`lib_tee_cli_read_protected_data`,但链接器找不到这个函数的实现。 分析: 1. 从错误信息看,这个函数名`lib_tee_cli_read_protected_data`可能与TEE(可信执行环境)客户端库有关。 2. 在链接命令中,我们已经链接了`-l_tee_client`,所以理论上这个函数应该由`lib_tee_client.so`或`lib_tee_client.a`提供。 3. 出现未定义引用,可能的原因有: a) 链接顺序问题:在链接时,库的顺序很重要,因为链接器会按照顺序解析未定义符号。如果某个库(比如`libtpssl.a`)需要`lib_tee_client`中的函数,那么`lib_tee_client`应该放在`libtpssl.a`的后面。 b) 库文件缺失:可能`lib_tee_client`库中确实没有包含这个函数的定义。 c) 函数名不匹配:可能是函数名在库中和调用处不一致(比如命名修饰问题,但C语言一般没有,除非用了C++)。 观察当前的链接命令: arm-ca9-linux-uclibcgnueabihf-gcc -o sdsectool sdsectool.o ... -l_tee_client ... -ltrk -lmbedtls ... 注意:`-l_tee_client`出现在`-ltpssl`之后,但是在`sslApi.o`(属于`libtpssl.a`)中调用了`lib_tee_cli_read_protected_data`,而`-l_tee_client`在`-ltpssl`之前?实际上,在链接命令中,`-l_tee_client`出现在`-ltpssl`之前,这是有问题的。 链接器的工作方式是:从左到右扫描库,当遇到未定义的符号时,会去后面出现的库中查找。但是,如果后面的库又引用了前面库中的符号,那么前面的库已经被扫描过了,不会再被重复扫描。因此,如果`libtpssl.a`需要`lib_tee_client`中的函数,那么`lib_tee_client`应该放在`libtpssl.a`的后面。 所以,解决方案可能是调整链接顺序,将`-l_tee_client`放在`-ltpssl`的后面。 但是,我们当前的链接命令中,`-l_tee_client`出现在`-ltpssl`之前。因此,我们需要调整顺序,将`-l_tee_client`移到`-ltpssl`之后。 修改后的链接命令建议: ... -ltpssl -l_tee_client ... # 将-l_tee_client放在-ltpssl之后 另外,还需要注意,如果`lib_tee_client`还依赖其他库(比如`-ltrk`等),则可能需要将`lib_tee_client`放在它所依赖的库之前(因为链接器是从左到右解析,所以被依赖的库应该放在后面)。但通常,我们会将基础库放在后面。 如果调整顺序后仍然出现同样的错误,那么我们需要检查`lib_tee_client`库中是否真的包含这个函数。可以使用以下命令检查: arm-ca9-linux-uclibcgnueabihf-nm /路径/to/lib_tee_client.a | grep lib_tee_cli_read_protected_data 如果没有找到,则可能是库的版本不对,或者需要链接其他库。 此外,错误信息中还提到了其他库(如`-lmbedtls`等),但根据错误信息,这个函数应该由`lib_tee_client`提供。 因此,我们首先尝试调整链接顺序。 修改链接命令如下(将`-l_tee_client`移动到`-ltpssl`后面,并保持其他库的顺序): arm-ca9-linux-uclibcgnueabihf-gcc -o sdsectool sdsectool.o -L/NVMPv5/NVMPv3/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-c530wsv2-28/usr/lib/nvmp/libs -ltpssl -l_tee_client -L/NVMPv5/NVMPv3/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-c530wsv2-28/usr/lib -ltrk -lmbedtls -lmbedx509 -lmbedcrypto 注意:我们将`-l_tee_client`从原来的位置(在`-ltpssl`之前)移到了`-ltpssl`之后。 如果这样调整后仍然不行,我们可能需要检查`lib_tee_client`是否在指定的库路径中,以及是否包含了该函数。 另外,注意链接命令中路径的换行是显示问题,实际路径是连续的。在命令行中应该写在一行,或者使用反斜杠换行。 由于错误信息中路径有换行,可能是复制的问题,实际路径应该是连续的,比如`/NVMPv5/NVMPv3/...`。 我们按照调整后的顺序重新链接。 如果问题仍然存在,则可能需要检查`lib_tee_client`的版本或者是否编译了该函数。 但是,根据错误信息,函数`lib_tee_cli_read_protected_data`是在`libtpssl`的源码中调用的,所以确保`lib_tee_client`库是最新的,并且包含了这个函数的实现。 另外,注意函数名:错误信息中的函数名是`lib_tee_cli_read_protected_data`,而库名是`_tee_client`,所以函数名前缀`lib_tee_cli`与库名`_tee_client`是匹配的。 总结:首先调整链接顺序,如果不行再检查库文件。 </think>### 链接错误分析与解决方案 您遇到的链接错误是由于 `lib_tee_cli_read_protected_data` 函数未定义引用导致的,具体分析如下: 1. **错误本质** 链接器在 `libtpssl.a` 的 `sslApi.c` 中找不到 `lib_tee_cli_read_protected_data` 函数的实现: ``` undefined reference to `lib_tee_cli_read_protected_data' ``` 2. **根本原因** - **库依赖顺序错误**:`-l_tee_client` (提供该函数的库) 在链接命令中出现在 `-ltpssl` (需要该函数的库) **之前** - **符号缺失**:`lib_tee_client.a` 可能未包含该函数实现,或使用了不同版本的库 - **路径问题**:链接器未正确找到包含该符号的库文件 3. **解决方案** **步骤1:调整链接顺序** 将 `-l_tee_client` 移到依赖它的库之后: ```bash arm-ca9-linux-uclibcgnueabihf-gcc -o sdsectool sdsectool.o \ -L/NVMPv5/NVMPv3/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-c530wsv2-28/usr/lib/nvmp/libs \ -ltpssl \ # 先声明需要符号的库 -l_tee_client \ # 后提供符号的库 -L/NVMPv5/NVMPv3/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-c530wsv2-28/usr/lib \ -ltrk -lmbedtls -lmbedx509 -lmbedcrypto ``` **步骤2:验证符号存在性** 检查 `lib_tee_client` 是否包含该符号: ```bash arm-ca9-linux-uclibcgnueabihf-nm /path/to/lib_tee_client.a | grep lib_tee_cli_read_protected_data ``` **步骤3:补充依赖库** 如果符号不存在,可能需要添加其他依赖库: ```bash ... -l_tee_client -ltee_supplicant -lteec ... ``` **步骤4:检查库版本** 确认使用的 `libtpssl` 和 `lib_tee_client` 版本是否兼容(查看编译日志或 Makefile)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值