سؤال

وبعض ولاية المنصات التي قمت بتوفير قائمة من الرموز الخارجية مكتبة مشتركة إلى رابط. ومع ذلك، في معظم النظم unixish هذا ليس ضروريا: سيكون كل الرموز غير ثابت متاح افتراضيا

وما أفهمه هو أن toolchain GNU يمكن تقييد اختياريا الرؤية فقط لحرف أعلن صراحة. كيف يمكن تحقيق ذلك باستخدام GNU دينار؟

هل كانت مفيدة؟

المحلول

وld GNU يمكن أن نفعل ذلك على منصات ELF.

وهنا هو كيف نفعل ذلك مع سيناريو النسخة رابط:

/* foo.c */
int foo() { return 42; }
int bar() { return foo() + 1; }
int baz() { return bar() - 1; }

gcc -fPIC -shared -o libfoo.so foo.c && nm -D libfoo.so | grep ' T '

وافتراضيا، يتم تصدير كل الرموز:

0000000000000718 T _fini
00000000000005b8 T _init
00000000000006b7 T bar
00000000000006c9 T baz
00000000000006ac T foo

ودعونا نقول لكم تريد تصدير فقط bar() وbaz(). إنشاء "نسخة النصي" libfoo.version:

FOO {
  global: bar; baz; # explicitly list symbols to be exported
  local: *;         # hide everything else
};

وتمريرها إلى رابط:

gcc -fPIC -shared -o libfoo.so foo.c -Wl,--version-script=libfoo.version

لاحظ حرف تصديرها:

nm -D libfoo.so | grep ' T '
00000000000005f7 T bar
0000000000000609 T baz

نصائح أخرى

وأعتقد أن أسهل طريقة للقيام بذلك هو إضافة لل-fvisibility=hidden إلى خيارات دول مجلس التعاون الخليجي وصراحة جعل رؤية بعض الرموز العامة في قانون (من قبل __attribute__((visibility("default")))). انظر هنا .

وربما تكون هناك وسيلة لتحقيق ذلك عن طريق البرامج النصية رابط دينار، ولكن أنا لا أعرف الكثير عن ذلك.

والشفرة التي تم إنشاؤها لاستدعاء أية وظائف تصديرها أو استخدام أي غلوبالس تصدير أقل كفاءة من تلك التي لا يتم تصديرها. هناك مستوى إضافي من indirection المعنية. وهذا ينطبق على أي وظيفة أن <م> قد يكون تصديرها في <م> ترجمة الوقت. ودول مجلس التعاون الخليجي لا تزال تنتج المراوغة إضافية للدالة التي يتم في وقت لاحق الامم المتحدة تصديرها من قبل برنامج نصي رابط. وذلك باستخدام السمة الرؤية سوف تنتج أفضل مدونة من النصي رابط.

إذا كنت تستخدم libtool، هناك خيار آخر يشبه إلى حد كبير إجابة الروسي حسابهن.

وعن طريق مثاله، قد يكون شيئا مثل:

cat export.sym
bar
baz

ثم تشغيل libtool مع الخيار التالي:

libtool -export-symbols export.sym ...

ملاحظة أنه عند استخدام وتصدير-حرف كل الرموز وNOT تصدير افتراضيا، وفقط أولئك في export.sym يتم تصديرها. (حتى "المحلية: *" سطر في libfoo.version ضمنا بالفعل في هذا النهج)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top