This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 链接器会将入口点函数地址不完全放置在请求的位置

Guru**** 2581345 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1125443/linker-places-entry-point-function-address-not-exactly-where-requested

器件型号:TM4C1294NCPDT

大家好、

我正在尝试将入口点函数放置在地址0x11000。  但链接器始终将其放置在0x11001。  我在链接期间不会收到警告或错误。

如果我跳转至0x11000 (所需地址)、处理器会崩溃。

如果我跳转至0x11001、程序会正常运行、因此我的入口点函数看起来实际上位于0x11001。

我已经提供了尽可能多的信息来证明这些矛盾。

谢谢、

Peter

我的链接器文件、在该文件中、我将输入函数映射到名为"myEntryPoint"的段、并将其映射到地址0x11000。

SECTIONS
{
    .intvecs:   > 0x00010000

    .text   :   > FLASH
    .const  :   > FLASH
    .cinit  :   > FLASH
    .pinit  :   > FLASH
    .init_array : > FLASH
    .test	:	> FLASH

    .vtable :   > 0x20000000
    .data   :   > SRAM
    .bss    :   > SRAM
    .sysmem :   > SRAM
    .stack  :   > SRAM
    .nvv 	: 	> SRAM

    myEntryPoint
    {
        entryPoint.obj(.text)
    } > 0x11000
}

我的链接器配置、其中我指定入口点的名称、位于 myEntryPoint.obj 中:

和我的地图文件的部分、这些部分与入口点的信息是矛盾的:

最后、通过 CCS 刷写程序后实际存储器的快照:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter、

    正确的起点是0x11001。 器件 是小端字节序器件、这意味着最低有效位被放置在优先位置。 因此、您的入口点符号需要首先从0x11001获取高16位、然后从0x11000获取低16位。

    更多 详细信息、请参阅器件数据表的第2.4.6节数据存储。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    感谢您花时间进行解释。

    如果我理解正确、我能不能做出这样的陈述(对于小端处理器):

    "显式映射到偶数地址的任何.text 段都应通过编程方式通过其下一个字节进行寻址。"

    我使用以下示例作为寻址方法。

    谢谢、

    Peter

    C 代码:

    int e1 = 0;
    void ResetISR(void)
    {
        e1++;
    
        __asm("    .global _c_int00\n"
              "    b.w     _c_int00");
    }

    汇编列表:

          66 00000000 4903              LDR       A2, $C$CON1           ; [DPU_V7M3_PIPE] |11|  ; [ORIG 16-BIT INS]
          67 00000002 6808              LDR       A1, [A2, #0]          ; [DPU_V7M3_PIPE] |11|  ; [ORIG 16-BIT INS]
          68 00000004 1C40              ADDS      A1, A1, #1            ; [DPU_V7M3_PIPE] |11|  ; [ORIG 16-BIT INS]
          69 00000006 6008              STR       A1, [A2, #0]          ; [DPU_V7M3_PIPE] |11|  ; [ORIG 16-BIT INS]

    "Memory"视图:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter、

    只要保留的值应为32字节值、例如下一个程序计数器值、地址值等、是。

    此致、

    Ralph Jacobi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="189615" URL"~//support/tools/code-composer-studio 组/CCS/f/code-composer-studio 论坛/1125443/linker-place-entry-point-function-address-non-try-finde-here-request/4174140#4174140"]器 件是放置最低有效位的低位器件。 [/报价]

    我想解释的是、TM4C 器件中的 Cortex-M CPU 仅支持 Thumb 模式。

    正如 Thumb 状态下函数的指针所解释 的、在 Thumb 模式下函数的指针具有最低有效位设置是正确的行为。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢切斯特和拉尔夫。

    我来自 C28xxx 世界、我对 ARM 中的 Thumb 模式这一整个概念都很陌生(现在我了解了为什么函数指针会以奇数形式进行寻址(获取它?) 方式)。

    以下是有关拇指模式说明的另一个链接、我认为该链接很有用(如果将来有人阅读此内容):

    https://stackoverflow.com/questions/10638130/what-is-the-arm-thumb-instruction-set

    再次感谢您的帮助和时间、

    Peter