将rodata 与创建它的函数一起保存

2024-04-21

我试图使 .rodata 部分位置与其关联的函数内存位置保持一致。我正在使用 GNU 编译器/链接器、裸机、plain-jane c 和 STM32L4A6 微控制器。

我有一个使用 STM32L4A6 控制器的定制板,其中 1Meg 闪存分为 512 - 2K 页。每个页面都可以通过 RAM 中运行的功能单独擦除和编程。我想利用这种细粒度的闪存组织来创建一个嵌入式固件应用程序,可以通过修改或添加代码中的各个函数来即时更新。我的方案是为可能需要更改或创建的每个功能指定一个单独的闪存页面。这对闪光灯来说是非常浪费的,但我永远不会使用超过 10% 的闪光灯,所以我可以承担得起浪费的代价。我已经在这方面取得了一些进展,现在可以通过上传非常小的二进制代码来对我的应用程序的操作进行重大更改。这些“补丁”通常甚至不需要重新启动系统。

我遇到的问题是,当函数包含任何类型的常量数据(例如文字字符串)时,它最终会出现在 .rodata 部分中。我需要给定函数的rodata 与创建它的函数位于同一区域。有谁知道我如何能够强制在函数中创建的 .rodata 保持附加到闪存中的同一函数?也许该函数中的 .rodata 可以紧跟在函数本身之后?也许我需要使用 -ffunction-sections 或类似的东西?我已经阅读了各种链接器手册,但仍然不知道如何做到这一点。下面是我的链接器脚本的开始。我不知道如何在各个页面部分中包含函数 .rodata。

示例函数:

#define P018 __attribute__((long_call, section(".txt018")))
P018 int Function18(int A, int B){int C = A*B; return C;}

显示我的问题的一个更好的例子如下:

#define P152 __attribute__((long_call, section(".txt152")))
P152 void TestFunc(int A){printf("%d Squared Is: %d\r\n",A,A*A);}

在这种情况下,可以在 .rodata 中找到“%d Squared Is: %d\r\n”的二进制等效项以及程序中的所有其他文字字符串。我希望它位于 .txt152 部分。

链接描述文件片段(主要由简单的控制台程序生成。)

MEMORY
{
    p000 (rx)      : ORIGIN = 0x08000000, LENGTH = 0x8000

    p016 (rx)      : ORIGIN = 0x08008000, LENGTH = 0x800
    p017 (rx)      : ORIGIN = 0x08008800, LENGTH = 0x800
    p018 (rx)      : ORIGIN = 0x08009000, LENGTH = 0x800
.
.
.
    p509 (rx)      : ORIGIN = 0x080fe800, LENGTH = 0x800
    p510 (rx)      : ORIGIN = 0x080ff000, LENGTH = 0x800
    p511 (rx)      : ORIGIN = 0x080ff800, LENGTH = 0x800

    ram (rwx)      : ORIGIN = 0x20000000, LENGTH = 256K
    ram2 (rw)      : ORIGIN = 0x10000000, LENGTH = 64K
}

SECTIONS 
{
    .vectors : 
    { 
        KEEP(*(.isr_vector .isr_vector.*))
    } > p000

    .txt016 : { *(.txt016) } > p016  /* first usable 2k page following 32k p000 */ 
    .txt017 : { *(.txt017) } > p017
    .txt018 : { *(.txt018) } > p018
.
.
.
    .txt509 : { *(.txt509) } > p509
    .txt510 : { *(.txt510) } > p510
    .txt511 : { *(.txt511) } > p511

    .text :
    {
        *(.text .text.* .gnu.linkonce.t.*)        
        *(.glue_7t) *(.glue_7)                      
        *(.rodata .rodata* .gnu.linkonce.r.*)       
    } > p000      
.
.
.

如果有人感兴趣,这是我用于执行擦除/编程操作的 RAM 代码

__attribute__((long_call, section(".data")))
void CopyPatch
(
        unsigned short Page,
        unsigned int NumberOfBytesToFlash,
        unsigned char *PatchBuf
)
{
    unsigned int            i;
    unsigned long long int  *Flash;

    __ASM volatile ("cpsid i" : : : "memory");                  //disable interrupts
    Flash = (unsigned long long int *)(FLASH_BASE + Page*2048); //set flash memory pointer to Page address
    GPIOE->BSRR = GPIO_BSRR_BS_1;                               //make PE1(LED) high
    FLASH->KEYR = 0x45670123;                                   //unlock the flash
    FLASH->KEYR = 0xCDEF89AB;                                   //unlock the flash
    while(FLASH->SR & FLASH_SR_BSY){}                           //wait while flash memory operation is in progress
    FLASH->CR = FLASH_CR_PER | (Page << 3);                     //set Page erase bit and the Page to erase
    FLASH->CR |= FLASH_CR_STRT;                                 //start erase of Page
    while(FLASH->SR & FLASH_SR_BSY){}                           //wait while Flash memory operation is in progress
    FLASH->CR = FLASH_CR_PG;                                    //set flash programming bit
    for(i=0;i<(NumberOfBytesToFlash/8+1);i++)
    {
        Flash[i] = ((unsigned long long int *)PatchBuf)[i];     //copy RAM to FLASH, 8 bytes at a time
        while(FLASH->SR & FLASH_SR_BSY){}                       //wait while flash memory operation is in progress
    }
    FLASH->CR = FLASH_CR_LOCK;                                  //lock the flash
    GPIOE->BSRR = GPIO_BSRR_BR_1;                               //make PE1(LED) low
    __ASM volatile ("cpsie i" : : : "memory");                  //enable interrupts
}

好吧...抱歉耽搁了,但我不得不考虑一下...

我不确定您是否可以仅使用链接器脚本[完全]完成此操作。它might有可能,但我认为有一种更简单/更可靠的方法[需要一些额外的准备]

我以前使用过的一种方法是编译-S得到一个.s文件。改变/破坏它。然后,编译修改后的.s

请注意,您可能会遇到一些全局问题,例如:

int B;

这将转到一个.commasm 源代码中的部分。这可能并不理想。

对于初始化数据:

int B = 23;

您可能需要添加一个部分属性以将其强制到一个特殊部分。否则,它最终会变成一个.data section

所以,我可能会避免.comm and/or .bss有利于的部分always使用初始化数据。那是因为.comm有同样的问题.rodata(即它最终成为一大团)。

无论如何,下面是一个逐步的过程。


我将部分名称宏放在一个公共文件中(例如)sctname.h:

#define _SCTJOIN(_pre,_sct)         _pre #_sct

#define _TXTSCT(_sct)       __attribute__((section(_SCTJOIN(".txt",_sct))))
#define _DATSCT(_sct)       __attribute__((section(_SCTJOIN(".dat",_sct))))

#ifdef SCTNO
#define TXTSCT              _TXTSCT(SCTNO)
#define DATSCT              _DATSCT(SCTNO)
#endif

这是您的稍作修改的版本.c文件(例如module.c):

#include <stdio.h>

#ifndef SCTNO
#define SCTNO   152
#endif
#include "sctname.h"

int B DATSCT = 23;

TXTSCT void
TestFunc(int A)
{
    printf("%d Squared Is: %d\r\n", A, A * A * B);
}

要创建.s文件,我们做:

cc -S -Wall -Werror -O2 module.c

实际的部分名称/编号可以在命令行上指定:

cc -S -Wall -Werror -O2 -DSCTNO=152 module.c

这给了我们一个module.s:

    .file   "module.c"
    .text
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "%d Squared Is: %d\r\n"
    .section    .txt152,"ax",@progbits
    .p2align 4,,15
    .globl  TestFunc
    .type   TestFunc, @function
TestFunc:
.LFB11:
    .cfi_startproc
    movl    %edi, %edx
    movl    %edi, %esi
    xorl    %eax, %eax
    imull   %edi, %edx
    movl    $.LC0, %edi
    imull   B(%rip), %edx
    jmp printf
    .cfi_endproc
.LFE11:
    .size   TestFunc, .-TestFunc
    .globl  B
    .section    .dat152,"aw"
    .align 4
    .type   B, @object
    .size   B, 4
B:
    .long   23
    .ident  "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)"
    .section    .note.GNU-stack,"",@progbits

现在,我们必须阅读.s并修改它。我创建了一个 perl 脚本来执行此操作(例如rofix):

#!/usr/bin/perl

master(@ARGV);
exit(0);

sub master
{
    my(@argv) = @_;

    $root = shift(@argv);

    $root =~ s/[.][^.]+$//;

    $sfile = "$root.s";
    $ofile = "$root.TMP";

    open($xfsrc,"<$sfile") or
        die("rofix: unable to open '$sfile' -- $!\n");

    open($xfdst,">$ofile") or
        die("rofix: unable to open '$sfile' -- $!\n");

    $txtpre = "^[.]txt";
    $datpre = "^[.]dat";

    # find the text and data sections
    seek($xfsrc,0,0);
    while ($bf = <$xfsrc>) {
        chomp($bf);

        if ($bf =~ /^\s*[.]section\s(\S+)/) {
            $sctcur = $1;
            sctget($txtpre);
            sctget($datpre);
        }
    }

    # modify the data sections
    seek($xfsrc,0,0);
    while ($bf = <$xfsrc>) {
        chomp($bf);

        if ($bf =~ /^\s*[.]section\s(\S+)/) {
            $sctcur = $1;
            sctfix();
            print($xfdst $bf,"\n");
            next;
        }

        print($xfdst $bf,"\n");
    }

    close($xfsrc);
    close($xfdst);

    system("diff -u $sfile $ofile");

    rename($ofile,$sfile) or
        die("rofix: unable to rename '$ofile' to '$sfile' -- $!\n");
}

sub sctget
{
    my($pre) = @_;
    my($sctname,@sct);

    {
        last unless (defined($pre));

        @sct = split(",",$sctcur);

        $sctname = shift(@sct);
        last unless ($sctname =~ /$pre/);

        printf("sctget: FOUND %s\n",$sctname);

        $sct_lookup{$pre} = $sctname;
    }
}

sub sctfix
{
    my($sctname,@sct);
    my($sctnew);

    {
        last unless ($sctcur =~ /^[.]rodata/);

        $sctnew = $sct_lookup{$txtpre};
        last unless (defined($sctnew));

        @sct = split(",",$sctcur);

        $sctname = shift(@sct);
        $sctname .= $sctnew;

        unshift(@sct,$sctname);
        $sctname = join(",",@sct);

        $bf = sprintf("\t.section\t%s",$sctname);
    }
}

新旧的区别module.s is:

sctget: FOUND .txt152
sctget: FOUND .dat152
--- module.s    2020-04-20 19:02:23.777302484 -0400
+++ module.TMP  2020-04-20 19:06:33.631926065 -0400
@@ -1,6 +1,6 @@
    .file   "module.c"
    .text
-   .section    .rodata.str1.1,"aMS",@progbits,1
+   .section    .rodata.txt152,"aMS",@progbits,1
 .LC0:
    .string "%d Squared Is: %d\r\n"
    .section    .txt152,"ax",@progbits

所以,现在,创建.o with:

cc -c module.s

对于 makefile,它可能类似于[带有一些通配符]:

module.o: module.c
    cc -S -Wall -Werror -O2 module.c
    ./rofix module.s
    cc -c module.s

现在,您可以在链接器脚本中为[您的原始部分]添加适当的位置.txt152和新的.rodata.txt152.

并且,初始化的数据部分.dat152

请注意,实际的命名约定是任意的。如果你想改变它们,只需修改rofix[和链接描述文件]适当地


这是readelf -a输出为module.o:

请注意,还有一个.rela.txt152部分!?!?

ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          808 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           64 (bytes)
  Number of section headers:         15
  Section header string table index: 14

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         0000000000000000  00000040
       0000000000000000  0000000000000000  AX       0     0     1
  [ 2] .data             PROGBITS         0000000000000000  00000040
       0000000000000000  0000000000000000  WA       0     0     1
  [ 3] .bss              NOBITS           0000000000000000  00000040
       0000000000000000  0000000000000000  WA       0     0     1
  [ 4] .rodata.txt152    PROGBITS         0000000000000000  00000040
       0000000000000014  0000000000000001 AMS       0     0     1
  [ 5] .txt152           PROGBITS         0000000000000000  00000060
       000000000000001a  0000000000000000  AX       0     0     16
  [ 6] .rela.txt152      RELA             0000000000000000  00000250
       0000000000000048  0000000000000018   I      12     5     8
  [ 7] .dat152           PROGBITS         0000000000000000  0000007c
       0000000000000004  0000000000000000  WA       0     0     4
  [ 8] .comment          PROGBITS         0000000000000000  00000080
       000000000000002d  0000000000000001  MS       0     0     1
  [ 9] .note.GNU-stack   PROGBITS         0000000000000000  000000ad
       0000000000000000  0000000000000000           0     0     1
  [10] .eh_frame         PROGBITS         0000000000000000  000000b0
       0000000000000030  0000000000000000   A       0     0     8
  [11] .rela.eh_frame    RELA             0000000000000000  00000298
       0000000000000018  0000000000000018   I      12    10     8
  [12] .symtab           SYMTAB           0000000000000000  000000e0
       0000000000000150  0000000000000018          13    11     8
  [13] .strtab           STRTAB           0000000000000000  00000230
       000000000000001c  0000000000000000           0     0     1
  [14] .shstrtab         STRTAB           0000000000000000  000002b0
       0000000000000078  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

There is no dynamic section in this file.

Relocation section '.rela.txt152' at offset 0x250 contains 3 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
00000000000a  00050000000a R_X86_64_32       0000000000000000 .rodata.txt152 + 0
000000000011  000c00000002 R_X86_64_PC32     0000000000000000 B - 4
000000000016  000d00000004 R_X86_64_PLT32    0000000000000000 printf - 4

Relocation section '.rela.eh_frame' at offset 0x298 contains 1 entry:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000020  000600000002 R_X86_64_PC32     0000000000000000 .txt152 + 0

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.

Symbol table '.symtab' contains 14 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS module.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    2
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    3
     5: 0000000000000000     0 SECTION LOCAL  DEFAULT    4
     6: 0000000000000000     0 SECTION LOCAL  DEFAULT    5
     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    7
     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    9
     9: 0000000000000000     0 SECTION LOCAL  DEFAULT   10
    10: 0000000000000000     0 SECTION LOCAL  DEFAULT    8
    11: 0000000000000000    26 FUNC    GLOBAL DEFAULT    5 TestFunc
    12: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    7 B
    13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf

No version information found in this file.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将rodata 与创建它的函数一起保存 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 如何在flutter中设置macos应用程序的默认大小?

    我正在尝试使用 flutter 构建 macOS 桌面应用程序 我希望应用程序是全宽 边到边的 但是 当我通过模拟器运行应用程序时 或者在构建之后 它总是启动大小为 800x600 的应用程序 我已将根容器的高度和宽度设置为 double
  • 如何用Hibernate实现3个多对多关系?

    我不能 100 确定这只是一个 Hibernate 问题 因为这可能是一个更抽象的决定 但我会尝试一下 由于问题描述有点长 我首先声明我想做的是看看是否可以将实现更改为更类似于最佳实践实现的东西 我有 3 个与此问题相关的实体 工作站 ws
  • 如何在 Ionic 3 中高效存储和使用身份验证

    我目前正在开发一个离子 3 4 适用于 iOS Android 的应用程序 我不熟悉身份验证过程或应用程序 在提供程序中使用 HTTP 请求后 我得到了我的对象 用户 但我完全不知道如何存储或处理它 有哪些好的做法 我是否应该将对象存储在提
  • 适用于 iPhone 视网膜显示屏的图像

    我有一个可以工作的应用程序 我已经在我的 iPod touch 上测试过了 一切都很好 我的标签栏图标和启动屏幕图像位于资源文件夹中的单独文件夹中 Resources gt images 现在 我知道对于 iPhone4 我需要使用 2x
  • 如何将列高设置为等于布尔玛(flexbox)中最长的列?

    我正在使用 Bulma 0 4 0 尽管答案可能与 Bulma 本身无关 如何将列高设置为与其他列相同 见下面的截图 编辑 codepen 包含更多显示实际行为的文本 https codepen io anon pen vmKVbx htt
  • Plon 全文索引 Excel 文件

    如何自定义 Plone 搜索引擎以激活 excel 文件的全文索引 我已经安装了 pdftotext 和 wv 用于 pdf word 文件全文索引 如果你添加产品 OpenXml https pypi python org pypi Pr
  • 在类中为其自己的字段使用 getter/setter 有什么好处吗? [复制]

    这个问题在这里已经有答案了 通常 在我自己的项目中 我使用 getter 和 setter 进行任何字段访问 并且我在工作中也遵循同样的做法 不久前 我们项目的技术负责人问我为什么要这样做 以及为什么这比仅仅使用字段本身更好 如果需要由子类
  • 由于频繁断网,repo 同步卡在 99%

    我尝试重新同步cyanogenmod源 一直到99 阶段 但是这个阶段好像有一个大文件 而且由于我的网络连接经常断开 所以无法下载它 每次发生断开连接时 fatal early EOF被打印出来 则repo sync停止 似乎在下次运行时
  • 幻影数据用例

    我试图理解 rust 中的 phantomData 我有一个 Foo 结构包裹着一个原始指针 我告诉编译器 Foo 不能比 a 更长寿 所以我试图防止属性 v 的值在 Foo 之前被删除 但是我发现当 String s 可以在 f 之前删除
  • 断开连接后保持 SSH 会话运行 - 过夜 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是对此的后续问题question https stackoverflow com questions 33041892 keep ssh
  • 使用 Word 互操作查找具有特定格式的一系列文本

    我有一个 MS Word 插件 需要仅根据其格式从一系列文本中提取文本 特别是在我的情况下 如果文本带有下划线或删除线 则带有下划线或删除线的字符 单词的范围通过需要找到 以便我可以跟踪它们 我的第一个想法是使用Range Find as
  • .Net File.GetLastAccessTime 更新文件的上次访问时间

    我们使用下面的行来获取文件的上次访问日期和时间 DateTime dtLastAccesstime File GetLastAccessTime sFilePath 但我们面临着奇怪的问题 上面的调用本身修改了最后访问时间 因此 我们有效地
  • Visual C++ 获取资源的路径

    我正在尝试将图像添加到 Visual C 项目并获取它的路径 基本上我想要的是向项目添加一些图像 以便它可以通过在项目内部而不是本地驱动器上获取必要的图像来在任何计算机上运行 我通过右键单击资源文件 在解决方案资源管理器菜单中 并添加 gt
  • 如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)创建新的 DateTime 对象?

    我已将时区设置为 config application rb 并且我希望默认情况下在我的应用程序中生成的所有时间都位于该时区 但是当我创建新的DateTime对象 使用 new 它创建它GMT 如何让它位于我的应用程序的时区 配置 应用程序
  • 如何将 NSString 从 CamelCase 转换为 TitleCase,将“playerName”转换为“Player Name”?

    我正在寻找将字符串从驼背格式转换为标题大小写格式的最简单方法 如何将 玩家姓名 更改为 玩家姓名 NSString str playerName NSMutableString str2 NSMutableString string for
  • 限制vb.net中列表框中的选择

    我正在 vb net 中创建一个包含列表框的 Web 控件 我知道我可以选择 单个 或 多个 选择模式 但我有兴趣将 多个 选择限制为预定大小 例如 阻止用户选择 3 个以上的项目 我尝试向列表框中添加一个验证器 这可能是一种前进的方法 但
  • 我无法刷新标准输入。如何在 C 中刷新标准输入?

    How to 刷新标准输入 为什么它在下面的代码片段中不起作用 include
  • Android:带有图标的选项菜单“更多列表”

    我喜欢 Android 在选项菜单中自动显示许多菜单项 当屏幕上的菜单项过多时 它会显示 更多 按钮 我想保持这种方式 但是当您按 更多 时弹出的菜单项中没有菜单图标 有什么办法可以让我否决这个吗 如果没有 当用户单击 更多 时如何显示我自
  • 如何在 C++ 中创建多个向量的组合而无需硬编码循环?

    我有几个数据看起来像这样 Vector1 elements T C A Vector2 elements C G A Vector3 elements C G T up to VectorK elements Note also that
  • 将rodata 与创建它的函数一起保存

    我试图使 rodata 部分位置与其关联的函数内存位置保持一致 我正在使用 GNU 编译器 链接器 裸机 plain jane c 和 STM32L4A6 微控制器 我有一个使用 STM32L4A6 控制器的定制板 其中 1Meg 闪存分为