c++ - জিসিসির-ডাব্লাসবি বিকল্পটি ঠিক কী করে? এটি দমন করার কী প্রভাব আছে?



linux gcc (1)

আপনি যখন লাইব্রেরির সীমানা অতিক্রম করছেন তখন আপনাকে কেবলমাত্র এবিআই সম্পর্কে চিন্তা করতে হবে। আপনার নিজের অ্যাপ্লিকেশন / লাইব্রেরির মধ্যেই এবিআই সত্যই গুরুত্ব দেয় না কারণ সম্ভবত আপনার সমস্ত অবজেক্ট ফাইল একই সংকলক সংস্করণ এবং সুইচ দিয়ে সংকলিত হয়েছে।

আপনার যদি ABI1 এর সাথে একটি লাইব্রেরি সংকলিত থাকে এবং ABI2 এর সাথে সংকলিত একটি অ্যাপ্লিকেশন থাকে তবে লাইব্রেরি থেকে ফাংশনগুলি কল করার চেষ্টা করার সাথে সাথে অ্যাপ্লিকেশনটি ক্রাশ হবে কারণ এটি আর্গুমেন্টগুলি সঠিকভাবে পাস করবে না। ক্র্যাশটি সংশোধন করার জন্য আপনাকে লাইব্রেরিটি (এবং এটির উপর নির্ভর করে অন্য কোনও গ্রন্থাগার) পুনরায় সংকলন করতে হবে।

আপনার নির্দিষ্ট ক্ষেত্রে যতক্ষণ আপনি আপনার অ্যাপ্লিকেশনটির মতো একই সংকলক সংস্করণ (বা কেবলমাত্র শিরোনাম হিসাবে nlohmann ব্যবহার করছেন) দিয়ে nlohmann সংকলন করেন তবে আপনাকে এবিআই পরিবর্তন সম্পর্কে চিন্তা করার দরকার নেই।

বিশ্বব্যাপী এই সতর্কবার্তাটিকে দমন করা একটি বিপজ্জনক বিকল্প বলে মনে হচ্ছে কারণ এটি আপনাকে ভবিষ্যতের এবিআইয়ের কোনও সমস্যা দেখার থেকে বিরত রাখবে। আরও ভাল বিকল্পটি #pragma প্রশ্নে কার্যকারী ফাংশনগুলির জন্য সতর্কতাটি নিষ্ক্রিয় করতে #pragma ব্যবহার করা হবে, যেমন:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wno-psabi"
void foo()
{
}
#pragma GCC diagnostic pop

পটভূমি

গত বছরে আমি নলোহমান জসন লাইব্রেরি ব্যবহার করছিলাম [1] এবং কোনও সতর্কতা arm-linux-gnueabi-* জিসিসি 5.x arm-linux-gnueabi-* ব্যবহার করে x86_64 এ ক্রস-সংকলন arm-linux-gnueabi-* । আমি যখন জিসিসিকে আরও নতুন সংস্করণে আপডেট করেছি তখন জিসিসি ক্রিপ্টিক ডায়াগোনস্টিক নোটের পৃষ্ঠা তৈরি করবে। উদাহরণস্বরূপ, এখানে নোটগুলির মধ্যে একটি

In file included from /usr/arm-linux-gnueabi/include/c++/7/vector:69:0,
             from include/json.hpp:58,
             from src/write_hsi.cpp:23:
/usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc: In member function void std::vector<_Tp, _Alloc>::_M_realloc_insert(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, long long int, long long unsigned int, double, std::allocator, nlohmann::adl_serializer>}; _Tp = nlohmann::basic_json<>; _Alloc = std::allocator<nlohmann::basic_json<> >]’:
/usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc:394:7: note: parameter passing for argument of type std::vector<nlohmann::basic_json<>, std::allocator<nlohmann::basic_json<> > >::iterator {aka __gnu_cxx::__normal_iterator<nlohmann::basic_json<>*, std::vector<nlohmann::basic_json<>, std::allocator<nlohmann::basic_json<> > > >}’ changed in GCC 7.1
   vector<_Tp, _Alloc>::
   ^~~~~~~~~~~~~~~~~~~
/usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc: In member function nlohmann::basic_json<ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer> nlohmann::basic_json<ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer>::parser::parse_internal(bool) [with ObjectType = std::map; ArrayType = std::vector; StringType = std::__cxx11::basic_string<char>; BooleanType = bool; NumberIntegerType = long long int; NumberUnsignedType = long long unsigned int; NumberFloatType = double; AllocatorType = std::allocator; JSONSerializer = nlohmann::adl_serializer]’:
/usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc:105:21: note: parameter passing for argument of type __gnu_cxx::__normal_iterator<nlohmann::basic_json<>*, std::vector<nlohmann::basic_json<>, std::allocator<nlohmann::basic_json<> > > >’ changed in GCC 7.1
_M_realloc_insert(end(), std::forward<_Args>(__args)...);
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

সংকলক বিকল্পগুলিতে -Wno-psabi যুক্ত করে -Wno-psabi সমাধান খুঁজে পাওয়া সহজ ছিল। প্রকৃতপক্ষে, এটি ছিল লাইব্রেরিতে ঠিক করা কার্যকর। [2]

আমি অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) এবং প্রসেসর-নির্দিষ্ট এবিআই (পিএসএবিআই) এর মূল বিষয়গুলি বুঝতে পারি। রেফারেন্সের জন্য, এই উত্তরটি [11] এবিআইগুলির একটি দ্রুত ওভারভিউ দেয়:

এবিআই ( অ্যাপ্লিকেশন বাইনারি ইন্টারফেস ) এমন একটি মান যা উচ্চ-স্তরের ভাষাগুলিতে নিম্ন-স্তরের ধারণাগুলি এবং একটি নির্দিষ্ট হার্ডওয়্যার / ওএস প্ল্যাটফর্মের মেশিন কোডের দক্ষতার মধ্যে একটি ম্যাপিংকে সংজ্ঞায়িত করে। এর মধ্যে অন্তর্ভুক্ত রয়েছে:

  • কীভাবে সি / সি ++ / ফোর্টরান / ... ডেটা ধরণগুলি মেমোরিতে রাখা হয় (ডাটা মাপ / প্রান্তিককরণ)
  • নেস্টেড ফাংশনটি কীভাবে কাজ করে (কোথায় এবং কীভাবে কোনও ফাংশনের কলারে ফিরে যেতে হবে সে সম্পর্কিত তথ্য কীভাবে সংরক্ষণ করা হয়, যেখানে সিপিইউতে নিবন্ধিত হয় এবং / অথবা মেমরি ফাংশন আর্গুমেন্টগুলি পাস হয়)
  • প্রোগ্রাম স্টার্টআপ / ইনিশিয়ালাইজেশন কীভাবে কাজ করে (কোনও "এক্সিকিউটেবল" কী ডেটা ফর্ম্যাট করে সেখান থেকে কোড / ডেটা কীভাবে লোড হয়, ডিএলএল কীভাবে কাজ করে ...)

এর উত্তরগুলি হ'ল:

  • ভাষা-নির্দিষ্ট (অতএব আপনি একটি সি এবিআই, সি ++ এবিআই, ফোর্টরান এবিআই, পাস্কাল এবিআই পেয়েছেন, ... এমনকি জাভা বাইটকোড স্পেক, যদিও সত্যিকারের হার্ডওয়্যারের পরিবর্তে একটি "ভার্চুয়াল" প্রসেসরকে লক্ষ্য করে, এটিই এবিআই),
  • অপারেটিং-সিস্টেম নির্দিষ্ট (একই হার্ডওয়্যারের এমএস উইন্ডোজ এবং লিনাক্স পৃথক এবিআই ব্যবহার করে),
  • হার্ডওয়্যার / সিপিইউ-নির্দিষ্ট (এআরএম এবং x86 এবিআই আলাদা)।
  • বিবর্তিত সময়ের (দীর্ঘ) সময়ের সাথে সাথে (বিদ্যমান এবিআইগুলি প্রায়শই আপডেট / রিভিড করা হত যাতে নতুন সিপিইউ বৈশিষ্ট্যগুলি যেমন ব্যবহার করা যায়, যেমন বলা যায় যে x86 এসএসই রেজিস্টারগুলিকে অ্যাপ্লিকেশনগুলি কীভাবে ব্যবহার করতে হবে তা নির্দিষ্ট করে কেবল একবারই সম্ভব হয়েছিল possible সিপিইউগুলির এই নিয়ম ছিল, সুতরাং বিদ্যমান এবিআইকে স্পষ্ট করে বলা দরকার)।

সুতরাং এবিআই হ'ল ওভাররিচিং উপাদান, এবং এর অন্যতম উপাদান ("হার্ডওয়্যার / সিপিইউ-নির্দিষ্ট" বিশদ) হল psABI।

আমার ইস্যু

আমার যে সমস্যা হচ্ছে তা হচ্ছে

  1. আমি এর প্রভাবগুলি না বুঝে সর্বজনীনভাবে সতর্কতা অক্ষম করা পছন্দ করি না।
  2. "নোটগুলি দূরে রাখতে" -Wno-psabi ব্যবহার "পরামর্শটি এই ধরণের ডায়াগনস্টিক নোটগুলির জন্য একটি সাধারণ সাধারণ পরামর্শ বলে মনে হয় যে সংকলক আপগ্রেড হওয়ার পরে" হঠাৎ উপস্থিত হবে "। [2] [3] [4] এমনকি একজন জিসিসি বিকাশকারী এটি করার পরামর্শ দেন। [5]
  3. জিসিসি ম্যানুয়ালটিতে -Wpsabi বা -Wno-psabi নথিভুক্ত নয় []] [7]

ফলস্বরূপ আমি সত্যিই নিশ্চিত নই যে -Wno-psabi ঠিক কী করবে এবং কোন প্রভাব ফেলবে না। একটি সম্পর্কিত বিকল্প -Wabi : [8]

-Wabi (C, Objective-C, C++ and Objective-C++ only)

G ++ যখন এমন কোড উত্পন্ন করে তা সতর্ক করে দিন যা সম্ভবত বিক্রেতার সাথে নিরপেক্ষ সি ++ এবিআই ...

এটি psABI- সম্পর্কিত পরিবর্তন সম্পর্কেও সতর্ক করে। এই মুহুর্তে জানা PSABI পরিবর্তনগুলির মধ্যে রয়েছে:

  • এসআইএসভি / x86-64- এর জন্য, পিএসএবিআই-তে উল্লিখিত হিসাবে দীর্ঘ ডাবল সদস্যযুক্ত ইউনিয়নগুলি মেমোরিতে পাস করা হয়। উদাহরণ স্বরূপ:

union U { long double ld; int i; };

union U সর্বদা স্মৃতিতে পাস করা হয়।

এই সমস্ত আমার বোঝার

  1. -Wabi পরিবর্তন হলে -Wabi সতর্কতা উত্পন্ন করবে।
  2. জিসিসি 7 জিসিসি 5 এ চালু হওয়া একটি এবিআই বাগ [9] ঠিক করেছে যা এআরএম লক্ষ্যগুলিকে প্রভাবিত করে।
    • রিলিজ নোটগুলিতে বলা হয়েছে "এটি একটি এবিআই পরিবর্তন" is [10]
    • কোনও কারণে রিলিজ নোটগুলি -Wpsabi যে ডকুমেন্টেড- -Wabi নয়, অননুমোদিত -Wpsabi ব্যবহার করার সাথে সম্পর্কিত ডায়াগোনস্টিক নোটগুলি তৈরি করা হয়েছে।
    • এবিআই-র এই পরিবর্তনটির ম্যানুয়ালটিতে উল্লেখ নেই।
  3. "এটি একটি এবিআই পরিবর্তন" এবং "ব্যবহার -Wpsabi " -Wpsabi আমার কাছে মনে হয় এটি বিশেষত একটি সোয়াবিআই পরিবর্তন, ভিন্ন ধরণের এবিআই পরিবর্তন নয়। (বাস্তবে এটি জিসিসির পিএসএবিআই বাস্তবায়নের একটি পরিবর্তন, পিএসএবিআই নিজেই নয়)

আমি জানি যে ডকুমেন্টেশনগুলি সর্বদা আপ টু ডেট থাকে না, বিশেষত এমন কোনও কিছুর জন্য যা একটি জ্ঞাত নথিভুক্ত বিকল্প। তবে আমার উদ্বেগটি হ'ল "ব্যবহার -Wno-psabi " বিভিন্ন ধরণের এই ক্রিপ্টিক ডায়াগোনস্টিক নোটগুলির জন্য আদর্শ প্রতিক্রিয়া বলে মনে হচ্ছে। তবে, আমার এবিআই সম্পর্কে প্রাথমিক ধারণাটি হিসাবে, কোনও এবিআই কি কোনও বড় চুক্তি পরিবর্তন করে না? শুধু বার্তাটি সরিয়ে দেওয়ার পরিবর্তে, আমার কোনও এবিআই পরিবর্তন সম্পর্কে উদ্বিগ্ন হওয়া উচিত নয়? অনিবন্ধিত স্টাফ এবং এবিআই বনাম psABI এর কিছু সূক্ষ্ম বিবরণের মধ্যে, আমি সত্যিই নিশ্চিত নই ...

উদাহরণস্বরূপ, আমি যদি এই নোটগুলি সরিয়ে -Wno-psabi জন্য যদি আমার -Wno-psabi যুক্ত করি, তবে ভবিষ্যতে যদি আমার প্রকল্পে প্রভাবিত করে এমন আরও একটি এবিআই পরিবর্তন হয়? আমি কী ভবিষ্যতের সতর্কতাগুলি বা গুরুত্বপূর্ণ নোটগুলি কার্যকরভাবে নিঃশব্দ করে দিয়েছি?

এছাড়াও, যদিও আমাদের বলা হয় "আপনি যদি সমস্ত কোডটি পুনরায় সংকলন করেন তবে উদ্বিগ্ন হওয়ার কিছু নেই," [5] "সমস্ত কোড" আসলে কী? এটা কি আমার সোর্স কোড? glibc? অন্য যে কোনও সিস্টেম-ব্যাপি ভাগ করা লাইব্রেরি আমি ব্যবহার করছি?

তথ্যসূত্র

  1. https://github.com/nlohmann/json
  2. https://github.com/nlohmann/json/issues/658
  3. https://stackoverflow.com/a/48149400
  4. https://stackoverflow.com/a/13915796/10270632
  5. https://gcc.gnu.org/ml/gcc/2017-05/msg00073.html
  6. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81831
  7. https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc
  8. https://gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/C_002b_002b-Dialect-Options.html
  9. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77728
  10. https://gcc.gnu.org/gcc-7/changes.html
  11. https://stackoverflow.com/a/8063350




abi