由于错误,ld我需要将 ELF 部分从一个目标文件复制到另一个目标文件。我可以将所需的部分转储到文件中,但问题是该objcopy选项--add-section需要二进制文件,因此部分类型信息会丢失。据我所知,我无法使用 binutils 设置部分的类型,但我希望我错了:)
我可以手动编辑二进制文件以设置节类型并解决根本问题,但我很好奇是否有基于标准工具的解决方案。
对于好奇的人来说,潜在的问题是,当 GNUld链接没有该部分的 ARM 目标文件.ARM.attributes(例如在其自己的部分中只有一个二进制 blob 的文件)时,它会选择一些默认值,导致它甚至为 RAM 函数生成无效的胶合板当包含调用的文件有好的.ARM.attributes
部分时。我能想到的唯一解决方案(待定
https://sourceware.org/bugzilla/show_bug.cgi?id=11897.ARM.attributes )是向二进制 blob 对象文件添加一个部分。.ARM.attributes但是,只有当该部分的类型为时,这才有效ARM_ATTRIBUTES。
我试图准确理解异常表 ( .arm.extab) 的工作原理。我知道这是依赖于编译器的,所以我将限制自己使用armcc(因为我使用的是Keil)。
表中的典型条目类似于:
b0aa0380 2a002c00 01000000 00000000
据我了解,第一个字编码个性例程的指令,而第三个字是重R_ARM_PREL31定位到 catch 块的开头。
让我困惑的是第二个词——它似乎被分成了两条短裤,其中第二条距离投掷功能开始处有一段距离,但我不确定到底是什么(也不确定第一条短裤的作用)。
是否有任何地方记录了这些条目的结构?
我找到了 2 个相关文档,但据我所知,它们没有依赖于编译器的信息,因此它们还不够:
我将差异结果保存到文件中:
bash-3.00$ cat /tmp/voo
18633a18634
> sashabrokerSTP
18634a18636
> sashatraderSTP
21545a21548
> yheemustr
Run Code Online (Sandbox Code Playgroud)
我真的需要登录:
bash-3.00$ cat /tmp/voo | egrep ">|<"
> sashaSTP
> sasha
> yhee
bash-3.00$
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试迭代下摆并打印名称时,我会收到错误.我只是不明白使用"if"和"while循环"的基本原理.最终,我想使用while循环,因为我想对行做一些事情 - 显然一次while只加载一行到内存中,而不是一次整个文件.
bash-3.00$ while read line; do if [[ $line =~ "<" ]] ; then echo $line ; fi ; done < /tmp/voo
bash-3.00$
bash-3.00$
bash-3.00$ while read line; do if [[ egrep "<" $line ]] ; then echo $line ; fi ; done < /tmp/voo
bash: conditional …Run Code Online (Sandbox Code Playgroud) 我正在浏览一个教程,它允许我删除两个目录(我正在使用一个 10 深的目录,全部为空),但是一旦我尝试删除第三个目录,它就会给我该错误消息,即使该目录中没有内容并且我在它上面的目录中。为什么是这样?顺便说一句,我正在使用终端。
短的:
我一直在尝试调试ModuleNotFoundError我的本地存储库克隆之一中发生的问题。
更多详情:
我有同一个存储库的两个克隆。目前两者都已签出主分支。我想运行一个 Python 脚本,它导入各种模块,导入其他模块等。在第一个存储库克隆中,我得到ModuleNotFoundError: No module named 'TheModuleInQuestion'. 在第二个克隆中,脚本成功导入了它需要的所有内容并且运行时没有错误 - 尽管 sys.path 不包含特定于存储库的文件夹名称,并且尽管可能导入的所有文件也存在于第一个存储库中。
我想通过观察导入过程、搜索文件夹的顺序以及第二个存储库中导入模块的路径来调试它,最好使用 pdb。我在线查看了 pdb 用户指南,但没有发现与此特定用例相关的内容。我该怎么做呢?
更多信息
我的所有存储库克隆都位于 ~/git 的子文件夹中(或者,因为我在 Windows 10 上使用 Git Bash,所以位于 C:\users\myusername\git)
我使用的是 Python 3.6.5 32 位。这不是最新版本,它是公司出于与某些软件包或其他软件包的兼容性原因而指定的版本。
>>> import sys
>>> sys.path
['', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'c:\\users\\myusername\\downloads\\pyopenssl-master\\src']
Run Code Online (Sandbox Code Playgroud)
得到后
ModuleNotFoundError: No module named 'TheModuleInQuestion'
Run Code Online (Sandbox Code Playgroud)
我已在我的存储库克隆中搜索名称以“TheModuleInQuestion”开头的文件。其中没有“The ModuleInQuestion.py”。各种文件夹包含:
我们正在为 STM32 芯片上的 ARM Cortex M4 编写一些代码。
我的理解是 Cortex-M4 有一些 32 位指令,但这些不是 32 位 ARM 指令,它们只是一些特殊指令。我认为粘合剂是为了在 ARM 和拇指指令集之间转换。那么为什么链接描述文件需要胶水呢?
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
Run Code Online (Sandbox Code Playgroud)
由于处理器仅支持拇指指令,我可以删除glue_7和吗?glue_7t这样做会释放任何闪存吗?
我无法找到适当的文档来解决我在内核和用户空间中生成一致的 HMAC 的问题。根据Linux Kernel Development中的 Robert Love 的说法,内存描述符mm->start_code和mm->end_code应该包含该.text段。在 ELF 文档中明确定义了在静态可执行文件中查找.text段,并且很容易理解。因此,给出以下两个代码片段,人们期望获得匹配的 HMAC:
核心:
__mm = get_task_mm(__task);
__retcode = ntru_crypto_hmac_init(__crypto_context);
if(__retcode != NTRU_CRYPTO_HMAC_OK)
return 1;
__retcode = ntru_crypto_hmac_update(__crypto_context, (const uint8_t*)__mm->start_code,
__mm->end_code - __mm->start_code);
if(__retcode != NTRU_CRYPTO_HMAC_OK)
return 1;
__retcode = ntru_crypto_hmac_final(__crypto_context, __hmac);
if(__retcode != NTRU_CRYPTO_HMAC_OK)
return 1;
return 0;
Run Code Online (Sandbox Code Playgroud)
用户区:
for (j = 0; j < file_hdr32.e_shnum; j++)
{
if (!strcmp(".text", strIndex + section_hdr32[j]->sh_name))
{
retcode = ntru_crypto_hmac_init(__crypto_context());
if(retcode != NTRU_CRYPTO_HMAC_OK)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用编译器(标准 C)编译裸机应用程序GCC。Cyclone V SoC我与处理器一起使用Cortex-A9。Eclipse DS-5。我收到这些错误 -"Region ram overflowed by 295376 bytes"和"section .text will not fit region ram"。
我认为问题不在于链接描述文件,而在于其他地方。我看到消息,编译器尝试将.c项目中的所有文件添加到一个.axf文件中,即使我的主.c文件(我编写程序的位置)中没有包含任何文件,当我.c从项目中删除一些未使用的文件时,它说"Region ram overflowed by 275433 bytes"(不同的溢出大小)。我应该怎么做才能摆脱这个错误?
今天早些时候,我试图生成一个在SubjectAltName扩展名中带有DNSName条目的证书:
$ openssl req -new -subj“ / C = GB / CN = foo” -addext“ subjectAltName = DNS:foo.co.uk” -addext“ certificatePolicies = 1.2.3.4” -key ./private-key.pem -out 〜/ req.pem
此命令导致以下错误消息:
名称应采用/ type0 = value0 / type1 = value1 / type2 = ...的格式,其中的字符可以通过进行转义。该名称不是这种格式:'C:/ Program Files / Git / C = GB / CN = foo'发出证书请求时出现问题
如何停止Git Bash将此字符串参数视为文件路径,或者至少停止对其进行更改?
我在 Windows 中构建GTSAM,现在我尝试用它构建一个示例应用程序。
示例应用程序非常简单(它是 GTSAM 的一部分),但是当我运行它时,我收到以下链接器错误:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol __imp_clock referenced in function gk_CPUSeconds example D:\MyData\SourceCode\gtsam_win\cmake\example_cmake_find_gtsam\build\metis-gtsamDebug.lib(timers.obj)
Run Code Online (Sandbox Code Playgroud)
和
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol __imp__time64 referenced in function time example D:\MyData\SourceCode\gtsam_win\cmake\example_cmake_find_gtsam\build\metis-gtsamDebug.lib(timers.obj) 1
Run Code Online (Sandbox Code Playgroud)
搜索表明这两个函数是 MSVC 库的一部分,它们应该链接到系统。
我该如何解决这个问题?
问题似乎是库构建和应用程序构建期间的设置不匹配,但我找不到任何不同的链接器设置。去哪里寻找这样的差异呢?
AC 程序在启动时继承其区域设置环境变量。这是自动发生的。但是,这些变量不会自动控制库函数使用的区域设置,因为 ANSI C 规定所有程序默认都以标准
"C"区域设置启动。
我读过,C 程序在启动时必须具有 C 语言环境,因此 C 程序在启动时必须执行如下操作:
setlocale(LC_ALL, "C");
Run Code Online (Sandbox Code Playgroud)
但是这行代码最终是如何出现在C程序中的呢?编译器会帮我添加它吗?
在 ARM GCC(纯 C 代码)上,当我声明一个常量时,如下所示
__attribute__((used,section(".rodata.$AppID")))
const uint8_t ApplicationID[16] = {
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x12, 0x34, 0x00, 0x00
};
Run Code Online (Sandbox Code Playgroud)
我没有在代码中引用它,它已被优化,并在地图文件上的废弃输入部分中列出。仅当我在源代码的其他地方引用它时,它才会包含在二进制输出中。
仅仅“ used”标签就足够了吗?在GCC手册(6.34.1公共变量属性)中我读到:
用过的
此属性附加到具有静态存储的变量,意味着即使看起来该变量未被引用,也必须发出该变量。
意思是把它放在指定段的固定内存地址,供单独的应用程序检查它
我正在运行 NXP MCUXpresso 11.1 提供的 ARM GCC,报告详细版本为
GNU C17 (GNU Tools for Arm Embedded Processors 8-2019-q3-update) version 8.3.1 20190703 (release) [gcc-8-branch revision 273027] (arm-none-eabi)
compiled by GNU C version 5.3.1 20160211, GMP version 6.1.0, MPFR version 3.1.4, …Run Code Online (Sandbox Code Playgroud) 我想了解您如何获得证书到期的剩余天数。
我需要“监控”特定的证书过期,并且希望它在过期前 30 天通知(电子邮件),直至续订。
我可以通过运行来查找证书:
$cert = "AAAAAAAEEEEEEEFIIIIIIIIIOOOOOOOOUUUUUUUU"
Get-ChildItem -Path cert: -Recurse | where {$_.Thumbprint -eq $cert}
Run Code Online (Sandbox Code Playgroud)
但如果低于 30 天,我如何获得剩余天数?
任何评论或帮助总是值得赞赏。
arm ×3
c ×3
elf ×2
gcc ×2
linker ×2
armcc ×1
bare-metal ×1
bash ×1
binutils ×1
c++ ×1
cmake ×1
command-line ×1
compilation ×1
cortex-m ×1
ds-5 ×1
git-bash ×1
gtsam ×1
hmac ×1
if-statement ×1
keil ×1
linux ×1
linux-kernel ×1
loops ×1
pdb ×1
powershell ×1
python ×1
python-3.x ×1
shell ×1
terminal ×1
thumb ×1
visual-c++ ×1
while-loop ×1
windows ×1