小编Hud*_*son的帖子

生成常量数据的%pc相对地址

有没有办法让gcc生成%pc常量的相对地址?即使字符串出现在文本段中,arm-elf-gcc也会生成一个指向数据的常量指针,通过%pc相对地址加载指针的地址,然后取消引用它.出于各种原因,我需要跳过中间步骤.举个例子,这个简单的功能:

const char * filename(void)
{
    static const char _filename[]
            __attribute__((section(".text")))
            = "logfile";
    return _filename;
}
Run Code Online (Sandbox Code Playgroud)

生成(编译时arm-elf-gcc-4.3.2 -nostdlib -c -O3 -W -Wall logfile.c):

00000000 <filename>:
   0:   e59f0000        ldr     r0, [pc, #0]    ; 8 <filename+0x8>
   4:   e12fff1e        bx      lr
   8:   0000000c        .word   0x0000000c

0000000c <_filename.1175>:
   c:   66676f6c        .word   0x66676f6c
  10:   00656c69        .word   0x00656c69
Run Code Online (Sandbox Code Playgroud)

我原以为它会产生更像的东西:

filename:
    add r0, pc, #0
    bx lr
_filename.1175:
    .ascii "logfile\000"
Run Code Online (Sandbox Code Playgroud)

有问题的代码需要部分独立于位置,因为它将在加载时重新定位到内存中,但也与未编译的代码集成-fPIC,因此没有全局偏移表.

我目前的工作是调用非内联函数(通过%pc相对地址完成)以类似于-fPIC代码的工作方式从编译位置查找偏移量:

static …
Run Code Online (Sandbox Code Playgroud)

gcc arm fpic relative-addressing

6
推荐指数
1
解决办法
2246
查看次数

Code golf:Diffie-Hellman密钥交换

回到ITAR时代,有一个流行的sig执行Diffie-Hellman密钥交换:

#!/usr/bin/perl -- -export-a-crypto-system-sig Diffie-Hellman-2-lines
($g,$e,$m)=@ARGV,$m||die"$0 gen exp mod\n";print`echo "16dio1[d2%Sa2/d0<X+d
*La1=z\U$m%0]SX$e"[$g*]\EszlXx+p|dc`
Run Code Online (Sandbox Code Playgroud)

使用现代直流电,这可以减少到相当多:

dc -e '16dio???|p'
Run Code Online (Sandbox Code Playgroud)

虽然具有模幂运算命令的现代直流形式('|'通过有效的指数倍增计算g ^ e%m)可能是除了APL之外无法比拟的,原始形式是否可以改进?请记住,e和m值会非常大; 对于加密安全性,它们都将为1024位.

cryptography code-golf public-key

2
推荐指数
1
解决办法
1825
查看次数