2012-09-28 18 views
8

मै मैक पर एक सी अनुप्रयोग संकलित करने की कोशिश कर रहा हूं। मैं एसएसई 4 और एईएस-एनआई इंट्रिनिक्स का उपयोग करता हूं।मैक पर एईएस-एनआई इंट्रिनिक्स का उपयोग कैसे कर सकता हूं?

लिनक्स में, मैं सिर्फ जीसीसी -msse4 साथ फोन और झंडे -maes और wmmintrin.h शीर्ष लेख शामिल हैं और मैं _mm_aesenc_si128(a, b) तरह _mm_add_epi64(a,b) या एईएस एनआई intrinsics तरह SSE intrinsics कॉल कर सकते हैं और सब कुछ ठीक काम करता है।

मैक पर, यह कठिन है, क्योंकि ऐप्पल जीवीसी को एलएलवीएम-जीसीसी के साथ बदलता है जो अभी तक एईएस-एनआई का समर्थन नहीं करता है। तो एसएसई 4 इंट्रिनिक्स ठीक काम करते हैं, लेकिन एईएस नहीं। यहां तक ​​कि इनलाइन असेंबली एईएस निर्देशों को भी कॉल नहीं किया जाता है।

इंटेल की वेबसाइट पर lots of AES example code है, लेकिन यह केवल लिनक्स और विंडोज के लिए है।

मैंने देखा कि आरडीआरएंड निर्देश भी llvm-gcc द्वारा असमर्थित है लेकिन इंटेल एक सी मैक्रो का उपयोग करके इसके लिए एक समाधान प्रदान करता है जो कच्चे मशीन बाइट कोड में फैलता है। (See the rdrand.h example file in this Intel library)

दुर्भाग्य से एईएस-एनआई निर्देशों के लिए कोई समान वर्कअराउंड नहीं है, संभवतः निर्देशों के तर्क हैं और स्थिर मशीन कोड बाइट्स के रूप में मूल्यांकन नहीं किया जा सकता है।

प्रोग्राम मौजूद हैं जो ऐप्पल के स्वयं के फ़ाइल वॉल्ट समेत मैक पर एईएस-एनआई का उपयोग करते हैं, इसलिए काम करने वाली कुछ विधि होनी चाहिए!

मेरे सवाल का ठोस बनाने के लिए, मैं कैसे (माउंटेन शेर xcode 4.4.1 में नवीनतम सार्वजनिक रिलीज) नवीनतम मैक जीसीसी-LLVM 4.2 का प्रयोग संकलित करने के लिए निम्नलिखित सरल कॉल प्राप्त होगा:

__m128i A, B, C; 
    /* A, B, C initialized here... */ 
    A = _mm_aesenc_si128(B, C); 

के लिए धन्यवाद कोई मदद!

+0

आपको [क्लैंग] (https://developer.apple.com/library/mac/#documentation/CompilerTools/Conceptual/LLVMCompilerOverview/_index.html), * नहीं * 'gcc' का उपयोग करना चाहिए। –

उत्तर

7

ऐप्पल डेवलपर समर्थन ने बताया कि एक्सकोड का उपयोग करना संभव नहीं था। (और वास्तव में उनका जवाब थोड़ा सा झटकेदार था और यह दर्शाता था कि एईएस-एनआई कुछ डेवलपर कभी भी उपयोग करने के लिए आवश्यक नहीं था, इसलिए मुझे परेशान नहीं होना चाहिए। धन्यवाद, धन्यवाद, ऐप्पल।)

हालांकि, मैंने किया ऐप्पल के सॉफ्टवेयर से बचने के लिए, दोनों कामकाजी समाधान ढूंढें। एक इंटेल के अपने वाणिज्यिक सी ++ कंपाइलर का उपयोग करना है। दूसरा स्रोत से जीसीसी 4.6 या 4.7 को डाउनलोड और संकलित करना है और इसे सीधे उपयोग करना है। यह वह विकल्प है जिसे मैंने चुना था। मैंने this guide. का पालन किया जीसीसी संकलित और स्थापित (जबकि साफ) अभी भी एक सीपीयू आंतरिक का उपयोग करने के लिए एक परेशानी और कामकाज है, लेकिन यह काम करता है। धन्यवाद, जीसीसी टीम!

+3

यह उत्तर बदल गया है क्योंकि ऐप्पल के बावजूद आधुनिक एक्सकोड (4.6.3) के साथ यह संभव है। – Barry

+0

एएसएम अस्थिर ("एसेनक ....": ...); // llvm और gcc-4.4 + दोनों पर काम करता है, पहले CPUID.01H जांचें: ECX.AESNI [बिट 25] = 1 – Barry

+0

टेकवे क्रिप्टो के बारे में सतर्क है, चाहे उच्च या निम्न-स्तर, केवल यह एक बड़ी हमले की सतह का पर्दाफाश करने के लिए एक सूक्ष्म कोडिंग गलती लेता है। – Barry

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^