Изменения глобальной переменной сборки внутри разделяемой библиотеки не отражаются извне в программе на C в Linux - PullRequest
0 голосов
/ 20 мая 2018

Я рассматриваю базовую сборку OpenSSL алгоритма AES.Теоретически я знаю, AES использует 10 раундов, когда длина ключа = 128 бит.Мне нужно проверить программно.Поэтому я увеличивал значение глобальной переменной (т.е. round_var) на 1 каждый раз, когда завершается один раунд AES.Таким образом, в конце операции AES на 1 блоке (16 байт) значение переменной будет равно 10, а в конце операции AES на 2 блоке (2x16 байт) значение переменной будет равно 20.

Вот чтоЯ сделал (aes-586.s),

;добавлено глобальное объявление данных

.data
.global          round_var
round_var:
.long 0


_x86_AES_decrypt_compact:

; this is the AES round, where I increment global round_var by 1

.L004loop:
    .
    .
    .

;increase round_var by 1 

movl round_var, %eax
addl $1,%eax
movl %eax, round_var

.
.
.
jmp .L004loop

После этого я успешно собрал Openssl,

. / config -g 386, совместно используемый --prefix = / usr

make

sudo make install

Этот сценарий bash, с помощью которого я выполняю расшифровку 2000 x 1000 раз, просто чтобы убедиться, что программа запущена, а не завершена, чтобы отразить правильное значение round_var.

cat run.sh


for i in `seq 1 1000`
do
/usr/bin/openssl enc -d -aes-128-ecb -in dummy_200.bin.enc -out dec-dummy_200.bin  -K A10BA778CBC2F2BDE3FB2C66F7F14FB6
done

Это программа на C, где я печатаю значение round_var.

//gcc dlsym_example.c -ldl

#include <dlfcn.h>
#include <stdio.h>

int main()
{
  void* lib=dlopen("/usr/lib/libcrypto.so",RTLD_NOW);

    long * func_addr =NULL;
    func_addr=(long *)dlsym(lib, "round_var");


    while(1)
    {
        if(func_addr !=NULL)
        { 
            printf("round_var %ld\n",*func_addr);

        }
    }    
return 0;
}    

Удивительно, но я получаю

round_var 0
round_var 0
round_var 0

Я ожидаю, что изменения в round_var должны быть отражены в программе на Си.Кстати, в режиме отладки GDB Я проверяю перекрестно, значение round_var увеличивается на 1 после каждого раунда aes, что означает, что логика увеличения round_var верна.

Где я делаю ошибки?Это связано с видимостью?

Заранее спасибо.

...