__Gxx_ পার্সোনালিটি_ভি0 কী?


103

এটি কোনও ওএস ডেভলপমেন্ট সাইট থেকে দ্বিতীয় হাতের প্রশ্ন, তবে এটি আমাকে উত্সাহিত করেছিল যেহেতু আমি কোথাও শালীন ব্যাখ্যা খুঁজে পাইনি।

জিসিসি ব্যবহার করে একটি ফ্রি-স্ট্যান্ডিং সি ++ প্রোগ্রাম সংকলন এবং লিঙ্ক করার সময়, কখনও কখনও এর মতো লিঙ্কার ত্রুটি ঘটে:

out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'

এটি স্পষ্টতই কারণ এই প্রতীকটি libstdc ++ এ সংজ্ঞায়িত হয়েছে, যা একটি মুক্ত-স্থিত পরিবেশে অনুপস্থিত। সমস্যা সমাধানের জন্য কোথাও কোথাও এই প্রতীকটি সংজ্ঞায়িত করা দরকার:

void *__gxx_personality_v0;

কোনটি দুর্দান্ত, তবে আমার কাছে এমন জিনিস পছন্দ হয় না যা কেবল যাদুবিদ্যায় কাজ করে ... সুতরাং প্রশ্নটি হল এই প্রতীকটির উদ্দেশ্য কী?

উত্তর:


93

এটি স্ট্যাক আনওয়াইডিং টেবিলগুলিতে ব্যবহৃত হয়, যা আপনি উদাহরণস্বরূপ দেখতে পেতে পারেন আমার অন্য প্রশ্নের উত্তর উত্তর । এই উত্তরে উল্লিখিত হিসাবে, এর ব্যবহারটি ইটানিয়াম সি ++ এবিআই দ্বারা সংজ্ঞায়িত করা হয়েছে , যেখানে এটি ব্যক্তিত্বের রুটিন নামে পরিচিত ।

এটি একটি বিশ্বব্যাপী ন্যূনাল অকার্যকর পয়েন্টার হিসাবে সংজ্ঞায়িত করে "কাজ" করার কারণ সম্ভবত কোনও কারণ ব্যতিক্রম ছোঁড়াচ্ছে না। যখন কোনও ব্যতিক্রম ছুঁড়ে ফেলার চেষ্টা করে, তখন আপনি এটিকে খারাপ ব্যবহার করতে দেখবেন।

অবশ্যই, যদি কিছুই ব্যতিক্রম ব্যবহার না করে তবে আপনি এগুলি অক্ষম করতে পারেন -fno-exceptions(এবং যদি আরটিটিআই ব্যবহার না করে তবে আপনি যুক্ত করতে পারেন -fno-rtti)। আপনি তাদের ব্যবহার করে থাকেন, আপনাকে (অন্যান্য উত্তর ইতিমধ্যে উল্লিখিত) সঙ্গে লিঙ্কটি আছে g++পরিবর্তে gccযা জুড়বে, -lstdc++আপনার জন্য।


2
সম্পর্কে টিপ জন্য ধন্যবাদ -fno-exceptions। আমি CPPFLAGS += -fno-exceptionsআমার মেকফিলটিতে যুক্ত করেছি এবং এটি ত্রুটির সমাধান করেছে।
অ্যালান কিন্মান

12

এটি ব্যতিক্রম পরিচালনার অংশ। জিসিসি ইএইচ প্রক্রিয়াটি বিভিন্ন ইএইচ মডেলগুলিকে মিশ্রিত করতে দেয় এবং ব্যতিক্রমী কোনও মিল হয় কিনা তা নির্ধারণ করার জন্য একটি ব্যক্তিত্বের রুটিন চাওয়া হয়, কোনটি চূড়ান্ত করতে হবে ইত্যাদি This ব্যতিক্রম হ্যান্ডলিং).


11

ব্যতিক্রম হ্যান্ডলিং বিনামূল্যে স্থায়ী বাস্তবায়নের অন্তর্ভুক্ত।

এর কারণ হ'ল আপনি সম্ভবত gccআপনার কোডটি সংকলন করতে ব্যবহার করেন । আপনি যদি বিকল্পটি সংকলন করেন তবে -###আপনি লক্ষ্য করবেন যে এটি -lstdc++লিঙ্কার প্রক্রিয়াটি শুরু করার সময় লিঙ্কার-বিকল্পটি অনুপস্থিত । সংকলনের সাথে g++সেই পাঠাগারটি অন্তর্ভুক্ত থাকবে এবং এটির মধ্যে এটি সংজ্ঞায়িত চিহ্নগুলি অন্তর্ভুক্ত থাকবে।


আমি সর্বদা ভেবেছিলাম জি ++ দিয়ে সংকলন কেবল তখনই করা দরকার যখন আপনি বিশেষভাবে সংকলকটিকে বলতে চান যে কোডটি সি ++ (উদাহরণস্বরূপ- অনুপস্থিত এক্সটেনশন)। এখন মনে হচ্ছে জিসিসি সহ সি ++ কোড সংকলন আসা লাইব্রেরির অন্তর্ভুক্তি মিস করে। কিছু লাইব্রেরি মিস করা ছাড়াও কি আমার file.cppসাথে সংকলনের gccপরিবর্তে আরও কিছু "পার্শ্ব প্রতিক্রিয়া" রয়েছে g++?
লেজার

1
@ ইস্কে যতদূর আমি জানি, লিঙ্কিংয়ের সাথে উভয়ের libstdc++মধ্যে একমাত্র পার্থক্য।
জোহানেস স্কাউব - লিটব

6

libstd++কোড বেসের একটি দ্রুত গ্রেপ নিম্নলিখিত দুটি ব্যবহারের ব্যবহার প্রকাশ করেছে __gx_personality_v0:

Libsupc ++ / unwind-cxx.h

// GNU C++ personality routine, Version 0.                                      
extern "C" _Unwind_Reason_Code __gxx_personality_v0
     (int, _Unwind_Action, _Unwind_Exception_Class,
      struct _Unwind_Exception *, struct _Unwind_Context *);

Libsupc ++ / eh_personality.cc এ

#define PERSONALITY_FUNCTION    __gxx_personality_v0
extern "C" _Unwind_Reason_Code
PERSONALITY_FUNCTION (int version,
                      _Unwind_Action actions,
                      _Unwind_Exception_Class exception_class,
                      struct _Unwind_Exception *ue_header,
                      struct _Unwind_Context *context)
{
  // ... code to handle exceptions and stuff ...
}

(দ্রষ্টব্য: এটি আসলে এর চেয়ে কিছুটা জটিল; কিছু শর্তসাপেক্ষ সংকলন রয়েছে যা কিছু বিশদ পরিবর্তন করতে পারে)।

সুতরাং, যতক্ষণ না আপনার কোডটি আসলে ব্যতিক্রম হ্যান্ডলিং ব্যবহার করছে না, প্রতীকটি নির্দিষ্ট করে void*কোনও কিছুই প্রভাবিত করবে না, তবে যত তাড়াতাড়ি এটি ঘটে, আপনি ক্র্যাশ হয়ে যাচ্ছেন - __gxx_personality_v0এমন একটি ফাংশন, কিছু গ্লোবাল অবজেক্ট নয়, তাই চেষ্টা করা হচ্ছে ফাংশনটি কল করতে 0 ঠিকানার দিকে ঝাঁপিয়ে পড়ছে এবং সেগফল্টের কারণ ঘটবে।


অগত্যা 0 এ ঝাঁপ দাও না; বিশ্বব্যাপী অবিচ্ছিন্ন তাই এটি সত্যিই কোনও মান হতে পারে।
স্ট্র্যাজার

6
স্ট্র্যাগার, গ্লোবালগুলি শূন্যে আঞ্চলিত হয় যদি প্রোগ্রামার তাদের আরম্ভ না করে
জোহানেস স্কাউব - লিটব

@ লিটিব: এটি কেবল সত্য যদি কার্নেলটি বিএস বিভাগে শূন্যকরণ প্রয়োগ করে :- পি। তবে হ্যাঁ, বিবেকহীনতার জন্য তাদের 0 টি হওয়া উচিত।
ইভান তেরান

9
@ ইভান তিরান: না, একটি আনুষঙ্গিক সি প্রয়োগকরণ সর্বদা বিশ্বব্যাপী সূচনা করবে 0 এ §5.1.2 এবং C99 স্ট্যান্ডার্ডের .76.7.8 অনুচ্ছেদ 10 দেখুন।
অ্যাডাম রোজেনফিল্ড

6

আমার একবারে এই ত্রুটি হয়েছিল এবং আমি এর উত্সটি জানতে পেরেছিলাম:

আমি একটি সিসি কম্পাইলার ব্যবহার করছিলাম এবং CLIENT.Cআমি সি সি + প্রোগ্রাম না করেও সি প্রোগ্রাম করছিলাম এবং আমার ফাইলটি কল করা হয়েছিল ।

জিসিসি .Cএক্সটেনশনটিকে সি ++ প্রোগ্রাম .cহিসাবে এবং এক্সটেনশনটিকে সি প্রোগ্রাম হিসাবে স্বীকৃতি দেয় (ছোট সি এবং বড় সি এর প্রতি সাবধান থাকুন)।

সুতরাং আমি আমার ফাইল CLIENT.cপ্রোগ্রামটির নামকরণ করেছি এবং এটি কাজ করেছে।


2

উপরের উত্তরগুলি সঠিক: এটি ব্যতিক্রম হ্যান্ডলিংয়ে ব্যবহৃত হয়। ম্যানুয়াল জিসিসি সংস্করণ 6 জন্য আরও তথ্য (বর্তমানে উপস্থিত নেই কোন সংস্করণটি 7 ম্যানুয়াল) আছে। কোনও বাহ্যিক ফাংশনকে সংযুক্ত করার সময় ত্রুটি দেখা দিতে পারে যা - জিসিসির সাথে অজানা - জাভা ব্যতিক্রম ছুঁড়ে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.