将共享库链接到可执行文件

时间:2016-10-19 11:23:49

标签: c gcc dynamic-linking shared-objects

libourown.so提供了函数f定义

执行gcc命令后,

gcc a.o libourown.so.1 -o app

1)

libourown.so中调用app时,f是否会在运行时与app相关联?或libourown.so在构建时是否与app相关联?

2)

libc.so中调用app之后,printf是否会在app上与libc.so相关联?或app在构建时是否与.controller('RequestForRideCtrl', function ($scope, $ionicHistory, $http, $ionicPopup, $state, $window, $compile,$timeout) { var Slat, Slng, Dlat, Dlng; var Slatlng, Destination; $scope.location = {}; $scope.location1 = {}; $scope.init = function () { var Smarker, Dmarker; var flag; var myLatlng = new google.maps.LatLng(19.9975, 73.7898); var mapOptions = { center: myLatlng, zoom: 16, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map"), mapOptions); var contentString = "<div><a ng-click=''>Click</a></div>"; var compiled = $compile(contentString)($scope); var infowindow = new google.maps.InfoWindow({ content: compiled[0] }); navigator.geolocation.getCurrentPosition(function (pos) { $scope.map.setCenter(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude)); Slat = pos.coords.latitude; Slng = pos.coords.longitude; var myLatlng = new google.maps.LatLng(Slat, Slng); $scope.map.setCenter(myLatlng); Smarker = new google.maps.Marker({ position: myLatlng, map: $scope.map, draggable: true, title: 'Source', label: 'S' }); google.maps.event.addListener(Smarker, 'drag', function (event) { var lat = document.getElementById("latbox").value = this.getPosition().lat(); var lng = document.getElementById("lngbox").value = this.getPosition().lng(); Slatlng = new google.maps.LatLng(lat, lng); flag=1; getPosition(Slatlng, flag); })}); $scope.$on('destination', function (evt, value) { $scope.variable = value; var Dlat = $scope.variable.geometry.location.lat(); var Dlng = $scope.variable.geometry.location.lng(); var myLatlngD = new google.maps.LatLng(Dlat, Dlng); $scope.map.setCenter(myLatlngD); var Dmarker = new google.maps.Marker({ position: myLatlngD, map: $scope.map, draggable: true, title: 'Destination', label: 'D' }); google.maps.event.addListener(Dmarker, 'drag', function (event) { var lat = document.getElementById("latbox1").value = this.getPosition().lat(); var lng = document.getElementById("lngbox1").value = this.getPosition().lng(); Destination = new google.maps.LatLng(lat, lng); flag = 0; getPosition(Destination, flag); }); function getPosition(marker, flag) { if (flag == 1) { var geocoder = new google.maps.Geocoder(); geocoder.geocode({'latLng': marker}, function (results, status) { if (status === google.maps.GeocoderStatus.OK) { if (results[1]) { $scope.location.formatted_address = results[1].formatted_address; $timeout(function () { $scope.$apply(function () { console.log('in source'); }); }, 2000); } else { console.log('Location not found'); } } else { console.log('Geocoder failed due to: ' + status); } }); } else { var geocoder = new google.maps.Geocoder(); geocoder.geocode({'latLng': marker}, function (results, status, element) { if (status === google.maps.GeocoderStatus.OK) { if (results[1]) { $scope.location1.formatted_address = results[1].formatted_address; $timeout(function () { $scope.$apply(function () { console.log('in des'); }); }, 2000); } else { console.log('Location not found'); } } else { console.log('Geocoder failed due to: ' + status); } }); } } 相关联?

4 个答案:

答案 0 :(得分:2)

答案与你的两个问题相同。共享库没有内置到您的可执行文件中(这是它们首先出现的主要原因之一!)。 当您运行应用程序时,drynamic链接器/加载器ld.so会加载必要的库。

您可以通过运行以下命令查看应用程序所需的共享库:

$ ldd ./app

在命令行上。

您可能会发现这对于理解Linux上的共享库非常有用:how to write shared libraries

答案 1 :(得分:1)

回答你的问题“libourown.so是否在运行时链接到应用程序,在应用程序中调用f?或libourown.so是否在构建时链接到应用程序?”

动态库一进入ram就会被链接。同样的答案对你的两个问题都有效。完成此类链接称为加载时间链接。

另一种方法是使用运行时链接的概念。使用像dlopen(),dlsym()

这样的函数

答案 2 :(得分:0)

共享对象的重点在于它不会静态链接到您的可执行文件,而是放在内存中并为需要它的人提供服务。

看看这个帖子: how can I link a shared object in C?

答案 3 :(得分:0)

无法静态链接到libourown.so文件:此文件缺少链接器工作所必需的信息。如果您需要静态链接到libourown.a,则有两种选择:

  • 生成库的静态版本libourown.so,并链接到

  • 使用statifier之类的工具在您的可执行文件中嵌入-static

默认情况下,Libc动态链接到可执行文件。您可以使用--wrap选项静态链接到它。应该注意的是,静态链接到libc将弊大于利,因为您的可执行文件正在使用的其他库可能会再次链接到libc 动态,并且两次链接到同一个库会导致灾难