Как сделать переменную, объявленную в конструкторе видимой в основном файле - PullRequest
0 голосов
/ 16 мая 2019

У меня есть два файла c:

  1. myconstructor.c, в котором есть реализация __attribute__ ((constructor)), чтобы он мог выполняться до main : в этом файле я объявил переменную a.

  2. main.c, в котором я пытаюсь получить доступ к переменной a: но я получаю ‘a’ undeclared (first use in this function)

Я создал общую библиотеку, в которую я включил свой конструктор, используя LD_PRELOAD.

__attribute__ ((constructor))
void myconstructor(){
    int a=5;
    printf("Hello from the constructor\n");

 int main(){
    printf("try to print a from  the main : %d\n",a);
    return 0;
}

1 Ответ

2 голосов
/ 16 мая 2019

Вы не можете получить доступ к локальным нестатическим переменным функции из другой функции. Особенно не напрямую, а особенно, если функция, к переменным которой вы хотите обратиться, завершена.

Используйте глобальный. (Обратите внимание, что если вы хотите переопределить глобальную переменную, определенную в основном исполняемом файле, вам нужно скомпилировать с -rdynamic).

Пример выполнения:

#!/bin/sh -eu
cat > lib.c <<'EOF'
#include <stdio.h>
int a = 5;
__attribute__ ((constructor))
static void myconstructor(void)
{
    a = 53; //pointless
    //^if the init value is known, you can simply use 
    //static initialization, omitting the constructor

    printf("Hello from the constructor\n");
}
EOF

cat > main.c <<'EOF'
#include <stdio.h>
#if EXTERN
extern int a;
#else
int a = 0;
#endif

int main(void)
{
    printf("try to print a from  the main : %d\n",a);
    return 0;
}
EOF
gcc lib.c -fpic -shared -o liblib.so
gcc -rdynamic  main.c -o inbuilt_overridable #-rdynamic makes the global overridable
gcc -L$PWD -DEXTERN main.c -llib -o nonabsolute_dynamic_lib
gcc -DEXTERN main.c $PWD/liblib.so  -o absolute_dynamic_lib

set -x
echo INBUILT
./inbuilt_overridable
echo ===

echo NON-ABSOLUTE DYNAMIC LIB
#if the lib isn't in standard system locations, you need the LD_LIBRARY_PATH env variable
LD_LIBRARY_PATH=$PWD ./nonabsolute_dynamic_lib
echo ===

echo ABSOLUTE LIB
#I think Cygwin doesn't support this, but Linux definitely does
./absolute_dynamic_lib
echo ===

echo INBUILT OVERRIDDEN
LD_PRELOAD=$PWD/liblib.so ./inbuilt_overridable
echo ===
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...