выходные символы `nm`, на которые нет ссылки в LC_SYMTAB` - PullRequest
0 голосов
/ 09 октября 2019

Почему?

Я пытаюсь воспроизвести поведение nm.

Задача

Команда nm /usr/libexec/sharingd выводит некоторые странные символы, такие как:

[..]
00000001001d7570 t -[_TtC8sharingd19SDAirDropHandlerIPA canHandleTransfer]
00000001001d8070 t -[_TtC8sharingd19SDAirDropHandlerIPA initWithTransfer:bundleIdentifier:]
00000001001d7ed0 t -[_TtC8sharingd19SDAirDropHandlerIPA singleItemActionTitle]
00000001001d75f0 t -[_TtC8sharingd19SDAirDropHandlerIPA suitableContentsDescription]
00000001001d7580 t -[_TtC8sharingd19SDAirDropHandlerIPA transferTypes]
00000001001e45a0 t -[_TtC8sharingd27SDAirDropContactHashManager .cxx_destruct]
00000001001daf60 t -[_TtC8sharingd27SDAirDropContactHashManager acquireTokenForIdentifier:]
00000001001dcf70 t -[_TtC8sharingd27SDAirDropContactHashManager init]
00000001001be700 t <redacted function 7904>
00000001001beb50 t <redacted function 7905>
00000001001bebf0 t <redacted function 7906>
00000001001bf050 t <redacted function 7907>
00000001001bf100 t <redacted function 7908>
00000001001bf3a0 t <redacted function 7909>
00000001001bf490 t <redacted function 7910>
00000001001bf4d0 t <redacted function 7911>
00000001001bf540 t <redacted function 7912>
00000001001bf580 t <redacted function 7913>
00000001001bf590 t <redacted function 7914>
00000001001bf5b0 t <redacted function 7915>
00000001001bf5d0 t <redacted function 7916>
00000001001bf5e0 t <redacted function 7917>
00000001001bf5f0 t <redacted function 7918>
[..]

Моя версия nm не выводит эти символы.

Откуда они?

Уточнения

1.

Часть имени этих символов (т. Е. _TtC8sharingd19SDAirDropHandlerIPA или canHandleTransfer) присутствует в таблице строк файла mach-o.

Однако они представлены в виде разных строк.

2.

Символ <redacted function xxx> отсутствует в любом месте файла mach-o.

3.

Эти символы не являются ссылками LC_SYMTABSКоманда загрузки.

1 Ответ

0 голосов
/ 10 октября 2019

Я также воспроизвел команду nm и также не обработал этот случай. Спасибо, что поделились.

Глядя на исходный код LLVM , кажется, что:

, если nm встречает LC_FUNCTION_STARTS (функция запускает сегмент), тогдаон получит разные (функции?) адреса.

Он проверяет, что каждый из этих адресов уже находится в symbol table.

Если это не так, то возникает случай, когда мы неhandle:

См. комментарий в строке 1672: «Увидеть, что этот адрес еще не указан в таблице. Подделать для него список nlist».

        // See this address is not already in the symbol table fake up an
        // nlist for it.
        if (!found) {
          NMSymbol F = {};
          F.Name = "<redacted function X>";
          F.Address = FoundFns[f] + BaseSegmentAddress;
          F.Size = 0;
          // There is no symbol in the nlist symbol table for this so we set
          // Sym effectivly to null and the rest of code in here must test for
          // it and not do things like Sym.getFlags() for it.
          F.Sym = BasicSymbolRef();
          F.SymFlags = 0;
          F.NType = MachO::N_SECT;
          F.NSect = 0;
          StringRef SegmentName = StringRef();
          StringRef SectionName = StringRef();
          for (const SectionRef &Section : MachO->sections()) {
            Section.getName(SectionName);
            SegmentName = MachO->getSectionFinalSegmentName(
                                                Section.getRawDataRefImpl());
            F.NSect++;
            if (F.Address >= Section.getAddress() &&
                F.Address < Section.getAddress() + Section.getSize()) {
              F.Section = Section;
              break;
            }
          }
          if (SegmentName == "__TEXT" && SectionName == "__text")
            F.TypeChar = 't';
          else if (SegmentName == "__DATA" && SectionName == "__data")
            F.TypeChar = 'd';
          else if (SegmentName == "__DATA" && SectionName == "__bss")
            F.TypeChar = 'b';
          else
            F.TypeChar = 's';
          F.NDesc = 0;
          F.IndirectName = StringRef();
          SymbolList.push_back(F);
          if (FoundFns[f] == lc_main_offset)
            FOS << "<redacted LC_MAIN>";
          else
            FOS << "<redacted function " << f << ">";
          FOS << '\0';
          FunctionStartsAdded++;
        }

И вот как эти символы кажутсяпоявляются.

...