@@ -174,10 +174,10 @@ Status UProbeManager::UpdateOpenSSLSymAddrs(obj_tools::RawFptrManager* fptr_mana
174174 return Status::OK();
175175}
176176
177- Status UProbeManager::UpdateGoCommonSymAddrs (ElfReader* elf_reader, DwarfReader* dwarf_reader ,
177+ Status UProbeManager::UpdateGoCommonSymAddrs (ElfReader* elf_reader, GoOffsetLocator* offset_locator ,
178178 const std::vector<int32_t >& pids) {
179179 PX_ASSIGN_OR_RETURN (struct go_common_symaddrs_t symaddrs,
180- GoCommonSymAddrs (elf_reader, dwarf_reader ));
180+ GoCommonSymAddrs (elf_reader, offset_locator ));
181181
182182 for (auto & pid : pids) {
183183 PX_RETURN_IF_ERROR (go_common_symaddrs_map_->SetValue (pid, symaddrs));
@@ -186,10 +186,10 @@ Status UProbeManager::UpdateGoCommonSymAddrs(ElfReader* elf_reader, DwarfReader*
186186 return Status::OK ();
187187}
188188
189- Status UProbeManager::UpdateGoHTTP2SymAddrs (ElfReader* elf_reader, DwarfReader* dwarf_reader ,
189+ Status UProbeManager::UpdateGoHTTP2SymAddrs (ElfReader* elf_reader, GoOffsetLocator* offset_locator ,
190190 const std::vector<int32_t >& pids) {
191191 PX_ASSIGN_OR_RETURN (struct go_http2_symaddrs_t symaddrs,
192- GoHTTP2SymAddrs (elf_reader, dwarf_reader ));
192+ GoHTTP2SymAddrs (elf_reader, offset_locator ));
193193
194194 for (auto & pid : pids) {
195195 PX_RETURN_IF_ERROR (go_http2_symaddrs_map_->SetValue (pid, symaddrs));
@@ -198,9 +198,9 @@ Status UProbeManager::UpdateGoHTTP2SymAddrs(ElfReader* elf_reader, DwarfReader*
198198 return Status::OK ();
199199}
200200
201- Status UProbeManager::UpdateGoTLSSymAddrs (ElfReader* elf_reader, DwarfReader* dwarf_reader ,
201+ Status UProbeManager::UpdateGoTLSSymAddrs (GoOffsetLocator* offset_locator ,
202202 const std::vector<int32_t >& pids) {
203- PX_ASSIGN_OR_RETURN (struct go_tls_symaddrs_t symaddrs, GoTLSSymAddrs(elf_reader, dwarf_reader ));
203+ PX_ASSIGN_OR_RETURN (struct go_tls_symaddrs_t symaddrs, GoTLSSymAddrs(offset_locator ));
204204
205205 for (auto & pid : pids) {
206206 PX_RETURN_IF_ERROR (go_tls_symaddrs_map_->SetValue (pid, symaddrs));
@@ -524,10 +524,10 @@ StatusOr<int> UProbeManager::AttachNodeJsOpenSSLUprobes(const uint32_t pid,
524524
525525StatusOr<int > UProbeManager::AttachGoTLSUProbes (const std::string& binary,
526526 obj_tools::ElfReader* elf_reader,
527- obj_tools::DwarfReader* dwarf_reader ,
527+ GoOffsetLocator* offset_locator ,
528528 const std::vector<int32_t >& pids) {
529529 // Step 1: Update BPF symbols_map on all new PIDs.
530- Status s = UpdateGoTLSSymAddrs (elf_reader, dwarf_reader , pids);
530+ Status s = UpdateGoTLSSymAddrs (offset_locator , pids);
531531 if (!s.ok ()) {
532532 // Doesn't appear to be a binary with the mandatory symbols.
533533 // Might not even be a golang binary.
@@ -546,10 +546,10 @@ StatusOr<int> UProbeManager::AttachGoTLSUProbes(const std::string& binary,
546546
547547StatusOr<int > UProbeManager::AttachGoHTTP2UProbes (const std::string& binary,
548548 obj_tools::ElfReader* elf_reader,
549- obj_tools::DwarfReader* dwarf_reader ,
549+ GoOffsetLocator* offset_locator ,
550550 const std::vector<int32_t >& pids) {
551551 // Step 1: Update BPF symaddrs for this binary.
552- Status s = UpdateGoHTTP2SymAddrs (elf_reader, dwarf_reader , pids);
552+ Status s = UpdateGoHTTP2SymAddrs (elf_reader, offset_locator , pids);
553553 if (!s.ok ()) {
554554 return 0 ;
555555 }
@@ -886,8 +886,30 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
886886 binary, dwarf_reader_status.msg ());
887887 continue ;
888888 }
889+
890+ auto build_info_s = ReadGoBuildInfo (elf_reader.get ());
891+ obj_tools::BuildInfo build_info;
892+ std::string go_version;
893+ if (build_info_s.ok ()) {
894+ auto & build_info_pair = build_info_s.ValueOrDie ();
895+ go_version = build_info_pair.first ;
896+ build_info = std::move (build_info_pair.second );
897+ } else {
898+ VLOG (1 ) << absl::Substitute (" Failed to read build info from binary $0. Message = $1" , binary,
899+ build_info_s.status ().msg ());
900+
901+ continue ;
902+ }
903+
889904 std::unique_ptr<DwarfReader> dwarf_reader = dwarf_reader_status.ConsumeValueOrDie ();
890- Status s = UpdateGoCommonSymAddrs (elf_reader.get (), dwarf_reader.get (), pid_vec);
905+
906+ // TODO(ddelnano): The struct and function offsets will be populated by the
907+ // next set of changes.
908+ StructOffsetMap struct_offsets;
909+ FunctionArgMap function_offsets;
910+ std::unique_ptr<GoOffsetLocator> offset_locator = std::make_unique<GoOffsetLocator>(
911+ dwarf_reader.get (), struct_offsets, function_offsets, build_info, go_version);
912+ Status s = UpdateGoCommonSymAddrs (elf_reader.get (), offset_locator.get (), pid_vec);
891913 if (!s.ok ()) {
892914 VLOG (1 ) << absl::Substitute (
893915 " Golang binary $0 does not have the mandatory symbols (e.g. TCPConn)." , binary);
@@ -898,7 +920,7 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
898920 if (!cfg_disable_go_tls_tracing_) {
899921 VLOG (1 ) << absl::Substitute (" Attempting to attach Go TLS uprobes to binary $0" , binary);
900922 StatusOr<int > attach_status =
901- AttachGoTLSUProbes (binary, elf_reader.get (), dwarf_reader .get (), pid_vec);
923+ AttachGoTLSUProbes (binary, elf_reader.get (), offset_locator .get (), pid_vec);
902924 if (!attach_status.ok ()) {
903925 monitor_.AppendSourceStatusRecord (" socket_tracer" , attach_status.status (),
904926 " AttachGoTLSUProbes" );
@@ -912,7 +934,7 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
912934 // Go HTTP2 Probes.
913935 if (!cfg_disable_go_tls_tracing_ && cfg_enable_http2_tracing_) {
914936 StatusOr<int > attach_status =
915- AttachGoHTTP2UProbes (binary, elf_reader.get (), dwarf_reader .get (), pid_vec);
937+ AttachGoHTTP2UProbes (binary, elf_reader.get (), offset_locator .get (), pid_vec);
916938 if (!attach_status.ok ()) {
917939 monitor_.AppendSourceStatusRecord (" socket_tracer" , attach_status.status (),
918940 " AttachGoHTTP2UProbes" );
0 commit comments