{"id":702,"date":"2011-02-19T01:01:22","date_gmt":"2011-02-19T00:01:22","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=702"},"modified":"2011-02-19T01:01:22","modified_gmt":"2011-02-19T00:01:22","slug":"enlace-dinamico","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=702","title":{"rendered":"Enlace dinamico"},"content":{"rendered":"<p>Acabo de lanzar la <a href=\"http:\/\/www.rastersoft.com\/programas\/ftp_bt4lxmedia_es.html\" target=\"_blank\">versi\u00f3n 8.0 de FPT_BT4LXMedia<\/a>. La primera novedad es la nueva versi\u00f3n de Transmission, la 2.21. La segunda es que, por fin, los ejecutables utilizan enlazado din\u00e1mico.<\/p>\n<p>Como recordareis, las versiones anteriores utilizaban enlazado est\u00e1tico porque no consegu\u00eda que arrancasen desde el disco, a pesar de utilizar LD_LIBRARY_PATH para apuntar al directorio con las nuevas bibliotecas. Para los que no sepan qu\u00e9 es eso, es una variable de entorno que permite a\u00f1adir nuevas rutas en donde buscar bibliotecas de enlace din\u00e1mico, y \u00e9stas tienen prioridad sobre las \u00abnormales\u00bb del sistema. As\u00ed, si tengo un programa enlazado con una versi\u00f3n concreta de libc, diferente de la del sistema, puedo instalarla en otro directorio (por ejemplo, \/tmp\/libs) y lanzar el programa con:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">LD_LIBRARY_PATH=\/tmp\/libs mi_programa<\/pre>\n<\/div>\n<p>Por desgracia, esto no funcionaba en mi disco duro. Tras investigar mucho, descubr\u00ed que el problema estaba en el enlazador din\u00e1mico en tiempo de arranque. Resulta que el n\u00facleo s\u00f3lo es capaz de arrancar, por s\u00ed solo, binarios que est\u00e9n enlazados est\u00e1ticamente. Para los din\u00e1micos lo que hace es delegar en <em>\/lib\/ld-linux.so<\/em> (o <em>\/lib\/ld-uclibc<\/em> en la biblioteca uClib). A pesar de llevar extensi\u00f3n .so, este fichero es realmente un programa (enlazado est\u00e1ticamente, claro) dise\u00f1ado para cargar en memoria el programa din\u00e1mico deseado, analizar qu\u00e9 bibliotecas necesita, cargarlas en memoria si a\u00fan no est\u00e1n, realizar toda la operaci\u00f3n de enlazado y, finalmente, lanzar el c\u00f3digo.<\/p>\n<p>Por desgracia, la versi\u00f3n del enlazador din\u00e1mico de la gentoo que utilizo para desarrollar es m\u00e1s reciente que la de mi disco duro, lo que hac\u00eda que recibiese un error cada vez que intentaba ejecutar un programa compilado directamente. Para complicar a\u00fan m\u00e1s las cosas, la ruta del enlazador din\u00e1mico est\u00e1 especificada en cada ejecutable de manera inamovible, estableci\u00e9ndose dicho valor durante la compilaci\u00f3n. Y por si fuera poco, el enlazador de Busybox no permite su ejecuci\u00f3n directa, por lo que tampoco pod\u00eda hacer un simple <em>\/lib\/ld-uclibc mi_programa<\/em>.<\/p>\n<p>Ante todo esto, la \u00fanica soluci\u00f3n que me qued\u00f3 fue la de copiar el enlazador din\u00e1mico del entorno de desarrollo en una carpeta diferente y, al compilar bftpd, transmission y ctransmission, especificar la ruta deseada. Esto se hace en la etapa final de enlazado mediante la opci\u00f3n <em>-Wl,&#8211;dynamic-linker=path\/al\/enlazador<\/em>. De esta manera bast\u00f3 con copiar el enlazador y el resto de bibliotecas a <em>\/tmp\/hdd\/root\/libs<\/em> y lanzar los programas con<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">LD_LIBRARY_PATH=\/tmp\/hdd\/root\/libs mi_programa<\/pre>\n<\/div>\n<p>Con esto espero ahorrar algo de memoria. Tambi\u00e9n har\u00e9 algunas pruebas para ver si los programas funcionan bien con la versi\u00f3n de la uClib del propio disco duro, en cuyo caso podr\u00eda ahorrar a\u00fan m\u00e1s.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Acabo de lanzar la versi\u00f3n 8.0 de FPT_BT4LXMedia. La primera novedad es la nueva versi\u00f3n de Transmission, la 2.21. La segunda es que, por fin, los ejecutables utilizan enlazado din\u00e1mico. Como recordareis, las versiones anteriores utilizaban enlazado est\u00e1tico porque no consegu\u00eda que arrancasen desde el disco, a pesar de utilizar LD_LIBRARY_PATH para apuntar al directorio &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=702\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Enlace dinamico<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5,7],"tags":[],"class_list":["post-702","post","type-post","status-publish","format-standard","hentry","category-nueva-version","category-programacion","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=702"}],"version-history":[{"count":0,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/702\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}