Hi Xiaozhu, I did the following. I think I am missing something below. Can you please check and let me know..
BPatch* bpatch = new BPatch; // open binary and dependencies BPatch_addressSpace* app = bpatch->openBinary(binary.c_str(), true); BPatch_image* image = app->getImage(); std::vector<BPatch_object*> objects; image->getObjects(objects); for (auto object : objects) { Dyninst::ParseAPI::CodeObject co = Dyninst::ParseAPI::convert(object); } It fails with src/register_usage.cc:190:54: error: cannot initialize a parameter of type 'const BPatch_function *' with an lvalue of type 'BPatch_object *' PopulateUsedRegisters(Dyninst::ParseAPI::convert(object), used); So obviously it's the wrong usage of the API. I am having trouble piecing together correct sequence of API calls for this. Appreciate your help. Cheers On Thu, Jan 24, 2019 at 8:53 PM Buddhika Chamith Kahawitage Don < budka...@iu.edu> wrote: > Hi Andreas, > > Thanks for the input. You are exactly right! :). I was looking for an > output similar to what ldd provides. My use case is to get register usage > patterns in a given binary and its linked shared libraries. > > On Thu, Jan 24, 2019 at 7:24 PM Xiaozhu Meng <xm...@cs.wisc.edu> wrote: > >> Another approach is to use BPatch_binaryEdit to open the binary, which >> has an option parameter to specify whether also opening its dependencies. >> Then you can convert BPatch_object to ParseAPI::CodeObject by doing: >> >> ParseAPI::CodeObject *ParseAPI::convert(BPatch_object *); >> >> > @ Xiaozhu. I will check this out as well. Thanks! > > >> On Thu, Jan 24, 2019 at 1:36 AM Andreas Ziegler <zieg...@cs.fau.de> >> wrote: >> >>> Hi, >>> >>> jumping into the conversation as I'm also doing research on shared >>> libraries and (in a broader sense) instrumentation as part of my PhD at >>> the University Erlangen-Nürnberg. :) >>> >>> On 1/24/19 4:18 AM, Buddhika Chamith Kahawitage Don wrote: >>> > It doesn't seem to provide the full path to the linked library, just >>> the >>> > library name. So when I use the return value to construct a >>> > SymtabCodeSource it fails. Any idea how to get the full path of the >>> > linked library? >>> > >>> >>> That depends on your current system and the execution environment. If >>> you're looking at the executable or shared library using 'readelf' (for >>> example with the -e parameter), you see that the file itself will only >>> specify the (file-)name of the library it requires. The actual >>> resolution to an absolute path is done in the linker and will take >>> default library search paths as well as the LD_LIBRARY_PATH and >>> LD_PRELOAD environment variables into account. >>> >>> If you're on the system you want to analyze and want to see which >>> libraries a given binary loads, try running 'ldd' on the binary in >>> question, this will run the linker up to the point right before >>> execution is handed over to the binary itself and print all imported >>> libraries as well as their paths. >>> >>> I'm quite interested in what you're working on, if you'd like you can >>> drop me a private mail. >>> >>> Regards, >>> >>> Andreas >>> >>> >>> > On Wed, Jan 23, 2019 at 10:20 PM Buddhika Chamith Kahawitage Don >>> > <budka...@iu.edu <mailto:budka...@iu.edu>> wrote: >>> > >>> > Great! I will check this out. >>> > >>> > Cheers >>> > Buddhika >>> > >>> > On Wed, Jan 23, 2019 at 10:01 PM Xiaozhu Meng <xm...@cs.wisc.edu >>> > <mailto:xm...@cs.wisc.edu>> wrote: >>> > >>> > Hi, >>> > >>> > If I am going to do it, I will try Symtab::getDependencies(), >>> > which should return a vector of paths of the dependencies: >>> > >>> > >>> https://github.com/dyninst/dyninst/blob/master/symtabAPI/h/Symtab.h#L366 >>> > >>> > Then, you can iterate over the vector to parse each of them. >>> > >>> > Thanks, >>> > >>> > --Xiaozhu >>> > >>> > On Wed, Jan 23, 2019 at 10:20 AM Buddhika Chamith Kahawitage >>> Don >>> > <budka...@iu.edu <mailto:budka...@iu.edu>> wrote: >>> > >>> > Hi All, >>> > >>> > I need to enumerate and parse linked shared libraries of a >>> > binary using Symtab API and Parse API. How can I do that? I >>> > am currently using below code sequence to parse the binary. >>> > >>> > Dyninst::SymtabAPI::Symtab* symtab; >>> > bool isParsable = >>> > Dyninst::SymtabAPI::Symtab::openFile(symtab, binary); >>> > if (isParsable == false) { >>> > const char* error = "error: file can not be parsed"; >>> > std::cout << error; >>> > return; >>> > } >>> > >>> > // Create a new binary code object from the filename >>> argument >>> > Dyninst::ParseAPI::SymtabCodeSource* sts = >>> > new >>> Dyninst::ParseAPI::SymtabCodeSource(binary.c_str()); >>> > Dyninst::ParseAPI::CodeObject* co = new >>> > Dyninst::ParseAPI::CodeObject(sts); >>> > co->parse(); >>> > >>> > auto fit = co->funcs().begin(); >>> > for (; fit != co->funcs().end(); ++fit) { >>> > Dyninst::ParseAPI::Function* f = *fit; >>> > .... >>> > } >>> > >>> > Regards >>> > Buddhika >>> > _______________________________________________ >>> > Dyninst-api mailing list >>> > Dyninst-api@cs.wisc.edu <mailto:Dyninst-api@cs.wisc.edu> >>> > https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api >>> > >>> > >>> > _______________________________________________ >>> > Dyninst-api mailing list >>> > Dyninst-api@cs.wisc.edu >>> > https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api >>> > >>> >>
_______________________________________________ Dyninst-api mailing list Dyninst-api@cs.wisc.edu https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api