交叉編譯中出現的 'Undefined reference to __aeabi_read_tp' 錯誤

一些開源軟件的configure程序不會爲用戶提供編譯器相關的細粒度控制,就像我用gcc-3.4.3這種老掉牙來編譯alsa-sound庫,給了一段莫名其妙的錯誤:

../src/.libs/libasound.a(pcm_dmix.o): In function `snd_pcm_dmix_sync_ptr':
pcm_dmix.c:(.text+0x2550): warning: Warning: snd_pcm_hwsync() is deprecated, consider to use snd_pcm_avail()
../src/.libs/libasound.a(error.o): In function `snd_lib_error_set_local':
error.c:(.text+0xb4): undefined reference to `__aeabi_read_tp'
error.c:(.text+0xc4): undefined reference to `__aeabi_read_tp'
../src/.libs/libasound.a(error.o): In function `snd_lib_error_default':
error.c:(.text+0x110): undefined reference to `__aeabi_read_tp'
error.c:(.text+0x124): undefined reference to `__aeabi_read_tp'
collect2: ld returned 1 exit status

查看代碼:

snd_local_error_handler_t snd_lib_error_set_local(snd_local_error_handler_t func)
{
	snd_local_error_handler_t old = local_error;
	local_error = func;
	return old;
}

看似沒有那些asm之類的代碼。google一通,看到有個拽人搞了個__aeabi_read_tp空函數解決了 *_*

只好回去仔細查看函數中的那三行代碼,終於找到了蛛絲馬跡,對於local_error有如下定義:

#ifndef DOC_HIDDEN
#ifdef HAVE___THREAD
#define TLS_PFX		__thread
#else
#define TLS_PFX		/* NOP */
#endif
#endif

看來是使用的編譯器不支持線程本地存儲關鍵字,而軟件包帶來的configure竟然也沒有這個控制選項。只好手動修改configure產生的config.h文件。

(簡單的去掉__thread是能通過編譯,但還是要手動實現相關數據的tls才能保證程序的行爲不變)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章