blob: 34eaabf226559dad365086b9375846b1b4781975 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#pragma once
#ifndef PACKAGE
#define PACKAGE
#endif
#ifndef PACKAGE_VERSION
#define PACKAGE_VERSION
#endif
#include <bfd.h>
#include <mutex>
#include <string>
#include <vector>
namespace doris {
class BfdParser {
public:
// Create parser for running process
static BfdParser* create();
static BfdParser* create(const std::string& file_name);
BfdParser(const std::string& file_name);
~BfdParser();
int parse();
// Decode address to function_name file_name and line number
// Call parse before call this function
// Return 0 if found and fill file_name, function_name, lineno
// -1 otherwise
int decode_address(const char* str, const char** end, std::string* file_name,
std::string* function_name, unsigned int* lineno);
long num_symbols() const { return _num_symbols; }
static void list_targets(std::vector<std::string>* targets);
void list_sections(std::string* ss);
private:
static void init_bfd();
int open_bfd();
int load_symbols();
static std::mutex _bfd_mutex;
static bool _is_bfd_inited;
std::string _file_name;
std::mutex _mutex;
bfd* _abfd = nullptr;
bfd_symbol** _syms = nullptr;
long _num_symbols;
unsigned int _symbol_size;
};
} // namespace doris