@@ -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 (ElfReader* elf_reader, 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(elf_reader, 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 (elf_reader, 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,21 @@ 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+ if (!build_info_s.ok ()) {
892+ VLOG (1 ) << absl::Substitute (
893+ " Failed to read build info from binary $0. Cannot deploy uprobes. "
894+ " Message = $1" ,
895+ binary, build_info_s.status ().msg ());
896+ continue ;
897+ }
898+ auto & [go_version, build_info] = build_info_s.ValueOrDie ();
899+
889900 std::unique_ptr<DwarfReader> dwarf_reader = dwarf_reader_status.ConsumeValueOrDie ();
890- Status s = UpdateGoCommonSymAddrs (elf_reader.get (), dwarf_reader.get (), pid_vec);
901+ std::unique_ptr<GoOffsetLocator> offset_locator =
902+ std::make_unique<GoOffsetLocator>(dwarf_reader.get (), build_info, go_version);
903+ Status s = UpdateGoCommonSymAddrs (elf_reader.get (), offset_locator.get (), pid_vec);
891904 if (!s.ok ()) {
892905 VLOG (1 ) << absl::Substitute (
893906 " Golang binary $0 does not have the mandatory symbols (e.g. TCPConn)." , binary);
@@ -898,7 +911,7 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
898911 if (!cfg_disable_go_tls_tracing_) {
899912 VLOG (1 ) << absl::Substitute (" Attempting to attach Go TLS uprobes to binary $0" , binary);
900913 StatusOr<int > attach_status =
901- AttachGoTLSUProbes (binary, elf_reader.get (), dwarf_reader .get (), pid_vec);
914+ AttachGoTLSUProbes (binary, elf_reader.get (), offset_locator .get (), pid_vec);
902915 if (!attach_status.ok ()) {
903916 monitor_.AppendSourceStatusRecord (" socket_tracer" , attach_status.status (),
904917 " AttachGoTLSUProbes" );
@@ -912,7 +925,7 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
912925 // Go HTTP2 Probes.
913926 if (!cfg_disable_go_tls_tracing_ && cfg_enable_http2_tracing_) {
914927 StatusOr<int > attach_status =
915- AttachGoHTTP2UProbes (binary, elf_reader.get (), dwarf_reader .get (), pid_vec);
928+ AttachGoHTTP2UProbes (binary, elf_reader.get (), offset_locator .get (), pid_vec);
916929 if (!attach_status.ok ()) {
917930 monitor_.AppendSourceStatusRecord (" socket_tracer" , attach_status.status (),
918931 " AttachGoHTTP2UProbes" );
0 commit comments