В качестве упражнения я пытаюсь реализовать свою собственную библиотеку мьютекса, которая будет использоваться в моих будущих программах на Си. Для этого мне рекомендуется использовать встроенную сборку, поэтому для x86 (AT & T) был создан следующий код:
#include "mymutex.h"
void init_my_mutex(my_mutex_t *mutex){
*mutex = 1;
}
void lock_my_mutex(my_mutex_t *mutex){
asm( "movq $0, %%rax\n\t" // temp = 0
"movq $0, %%rbx\n\t"
"1: xchgq (mutex), %%rax\n\t"
"cmpq %%rax, %%rbx\n\t"
"jz 1b\n\t":::"rax","rbx");
}
void unlock_my_mutex(my_mutex_t *mutex){
*mutex = 1;
}
Проблема в том, что я не знаю, как правильно адресовать *mutex
внутри asm()
внутри lock_my_mutex
. gcc -c mymutex.c -o mymutex.o
компилируется нормально, но при попытке скомпилировать мою тестовую программу, count-primes.c
, с gcc -pthread count-primes.c mymutex.o -o count-primes
, я получаю следующую ошибку: relocation R_X86_64_32S against undefined symbol 'mutex' can not be used when making a PIE object; recompile with -fPIC
. Я попытался перекомпилировать с -fPIC
(я не знаю, как это должно помочь), но я все еще получаю ту же ошибку.
Мой заголовочный файл выглядит так:
#ifndef __mymutex_h
#define __mymutex_h
// Our mutex is very simple so it is either locked
// or unlocked and we don't keep any other information
typedef long long my_mutex_t;
// Initializes a mutex to be unlocked
void init_my_mutex(my_mutex_t *mutex);
// Tries to grab a lock. The function only
// returns when the current thread holds the lock
void lock_my_mutex(my_mutex_t *mutex);
// Unlock the mutex. You don't need to check to see
// if the current thread holds the lock
void unlock_my_mutex(my_mutex_t *mutex);
#endif
В count-primes.c
я пытаюсь использовать мьютекс следующим образом:
my_mutex_t lock;
...
lock_my_mutex(&lock);
// Synchronized operation
unlock_my_mutex(&lock);
...
Я подозреваю, что проблема связана с моей адресацией мьютекса при использовании asm()
, и думаю, что понимание того, как (и почему) это сделать, позволило бы мне выполнить упражнение. Но помощь в любом другом отношении также очень ценится.
Best
Штеффен.